我在JSP中实现自定义404处理程序 - AEM,CQ。 该文件位于apps / sling / servlet / errorhandler / 404.jsp
中我正在使用RequestDispatcher类拦截Not Found和转发请求。
<%@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);
}
%>
以上代码获取error-page.html的内容,保持URL相同,但发回的响应代码不是404.而是200.
如何退回404?
答案 0 :(得分: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之后检查?