2016-07-14 42 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