2016-07-14 80 views
1

我正在JSP中实现自定义404处理程序 - AEM,CQ。 该文件居住在应用程序/ sling/servlet/errorhandler/404.jsp使用请求分派器发送404请求JSP

我拦截未找到的请求并使用RequestDispatcher类转发。

<%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling"%> 
<sling:defineObjects /> 
<% 
    // setting response code as 404 
    response.setStatus(HttpServletResponse.SC_NOT_FOUND); 
response.setStatus(404); 
System.out.println(response.getStatus()); 
     try { 
      RequestDispatcher rd = request.getRequestDispatcher("/error-page.html"); 

      rd.forward(request, response); 


     } catch (Exception e) { 
      RequestDispatcher rd = request.getRequestDispatcher("/error-page.html"); 
      rd.forward(request, response); 

     } 

%> 

上面的代码获取错误page.html中的保持URL相同的内容,但发回的响应代码不是404,是200吧。

如何返回404?

+0

如果你正在转发到错误页面(和错误页面存在),你一定会得到200,对不对? – ochi

+0

我也这么认为,我试图包括(请求,水库),但仍然200. – shank

+0

发送404错误代码的点是什么,因为你已经截获它,并发送遗传404错误页面。你可以只记录错误信息并继续?我不明白其背后的原因。 –

回答

2

使用#include而不是#forward将允许您返回404:

response.setStatus(HttpServletResponse.SC_NOT_FOUND); 
RequestDispatcher dispatcher = request.getRequestDispatcher(path); 
dispatcher.include(request,response); 

我建议创建一个Java Servlet的,而不是使用JSP:

@SlingServlet(metatype = true, resourceTypes = {"/apps/sling/servlet/errorhandler"}, extensions = {"404"}) 
public class ErrorServlet extends SlingSafeMethodsServlet { 

    @Override 
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { 
     response.setStatus(HttpServletResponse.SC_NOT_FOUND); 
     RequestDispatcher dispatcher = request.getRequestDispatcher("myPath"); 
     dispatcher.include(request,response); 
    } 
} 

你的状态代码检查直接在AEM中还是在Apache和Dispatcher之后检查?

+0

我正在两处检查,但此策略适用于AEM发布和调度程序。 Servlet似乎是一种更干净的方法。谢谢! – shank

+0

如果您仅查看发布的Dispatcher,我希望在Dispatcher之前查看您的结果,因为我们不知道您的Apache Web服务器是如何配置的。 – nateyolles