2016-07-14 4 views
1

Ich implementiere eine benutzerdefinierte 404-Handler in JSP - AEM, CQ. Die Datei lebt in apps/sling/servlet/errorhandler/404.jspSenden 404 mit Anfrage Dispatcher JSP

Ich abzufangen die Anfrage für Not Found und Weiterleitung mit RequestDispatcher-Klasse.

<%@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); 

     } 

%> 

Der obige Code wird den Inhalt des fehler seite.html die URL gleich gehalten, aber der Antwortcode nicht zurück 404. Es ist 200 statt gesendet wird.

Wie kann ich einen 404 zurückgeben?

+0

Wenn Sie auf eine Fehlerseite weiterleiten (und die Fehlerseite existiert), müssen Sie eine 200 bekommen, richtig? – ochi

+0

Ich denke auch, ich habe versucht, (req, res), aber immer noch 200. – shank

+0

was ist der Punkt des Sendens 404 Fehlercode, wie Sie bereits abgefangen haben und schickte eine genetische 404 Fehlerseite. Sie könnten einfach die Fehlermeldung protokollieren und fortfahren? Ich verstehe den Grund dafür nicht. –

Antwort

2

Mit #include statt #forward ermöglicht es Ihnen, ein 404 zurückzukehren:

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

würde ich vorschlagen, ein Java-Servlet zu schaffen, anstatt mit 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); 
    } 
} 

Sind Sie für den Statuscode überprüft in AEM direkt oder überprüfen Sie nach Apache und Dispatcher?

+0

Ich überprüfe an beiden Orten, aber diese Strategie funktioniert sowohl auf AEM veröffentlichen und Dispatcher. Servlet schien ein sauberer Ansatz zu sein. Vielen Dank! – shank

+0

Wenn Sie nur den Post-Dispatcher überprüft haben, würde ich Ihr Ergebnis vor dem Dispatcher sehen wollen, da wir nicht wissen, wie Ihr Apache-Webserver konfiguriert ist. – nateyolles