Mit sendRedirect innerhalb eines servlet weitergeleitet, mit der bitte dispatcher
Ich habe einen filter implementiert, mit der eine benutzerdefinierte Konvention zum laden von servlets und JSPs. In diesem übereinkommen verwende ich den folgenden code zum zählen der servlet:
servletContext
.getRequestDispatcher( uriDispatcherLocator.getServletLocation( uri ) )
.include( request, response );
und den folgenden code zum einbinden der JSP (in den gleichen filter):
servletContext
.getRequestDispatcher( "/index.jsp" )
.include( request, response );
Alles funktioniert einwandfrei, das servlet ausgeführt wird, dann enthält es die JSP und einige irrelevante benutzerdefinierte Regeln stattfinden.
Wie Sie sehen können, in dem Augenblick in dem ich eine servlet mit request dispatcher ich kann nicht senden Sie eine http-header-response an den client.
Das problem ist, dass ich will, dass die servlet-volle Kontrolle über die Antwort, als ob es genannt wurde, die aus dem inneren der filter (denn das filter wird nichts anderes tun, als dinamically mapping der servlets entsprechend Ihrer jeweiligen Klasse/JSP Lage in der Projekt-Datei-system).
Ich kann verwenden .forward()
statt .include()
, aber wenn ich tun ich werde nicht in der Lage sein, um eine JSP nachdem Sie das servlet ausgeführt wurde.
So, wie würde ich die Servlets führen Sie den code unten, wenn Sie einbezogen wird, durch einen filter per RequestDispatcher-Schnittstelle?
response.sendRedirect( "/somePath" );
Keine Javascript-hacks, ich bin bereit, senden Sie die korrekte HTTP-Antwort vom server, um den browser Verhalten sich korrekt.
--
BEARBEITEN:
In anderen Worten:
Möchte ich ändern Sie den Header an den client gesendet, von INNEN ein mitgeliefertes servlet mittels RequestDispatcher, aber die docs Staaten:
The included servlet cannot change the response status code or set headers; any attempt to make a change is ignored.
- Sie kann nicht Rendern jsps, wenn Sie gehen, um zu senden eine Umleitung. Wahrscheinlich bin ich Missverständnis, was Sie zu erreichen versuchen.
- Sie könnte eine exception werfen, in das servlet zu geben, den filter umleiten statt. Nicht die eleganteste Lösung, aber zumindest die decition umleiten könnte, bleiben Sie in der servlet...
- Ich bin auch der servlet-content in die Antwort. Ich möchte das servlet, in der Lage sein, um die Bearbeitung der Kopf-und gehören die jsp mit dem filter.
- Ich möchte nicht einfach umleiten. Manchmal sollte es erforderlich sein, um die Manipulation der Header irgendwie so I cant erstellen Sie eine Ausnahme geben für jedes Verhalten (obwohl es irgendwie ein wenig Sinn)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Filter umfasst Ihr servlet
Ihre Servlet zeigt es will redirect
oder, möchte hinzufügen eine oder mehrere Antwort Header
Ihre Filter Prüfungen für diese speziellen Anforderungen
BEARBEITEN: Vielleicht haben einige Ihrer servlets sind bereits fahren, die Strömung und die Einstellung der Antwort-Header beim Aufruf von außerhalb zählen. Aber, es gibt keine Möglichkeit zur Wiederverwendung von als Sie ist. Sie können nicht einfach zählen Ihnen und erwarten das gleiche Verhalten, weil das Ziel einer RequestDispatcher#include() ist für server-side includes (SSI) nur.
Daher finden wir keine überladenen Methoden (oder alle setter könnte, ändern Sie dieses Verhalten) in der API. Wenn Sie möchten, schließen Sie solche servlets und behalten Ihr Verhalten (wie Weiterleitungen) Sie hätten, um an Ihnen einen Hinweis, dass Sie unter einer gehören Kontext, und so Unterwerfen sollten Ihre response-Anfragen.