Ist es möglich, das weiterleiten oder umleiten von ein servlet filter nach der Antwort begangen wurde?
Die Logik ist, dass der filter getroffen wird, ist die Bedingung nicht wahr, so geht es durch die filter-chain. Nach der Antwort verpflichtet sich, den filter getroffen wird, und die Bedingung ist wahr (Anfrage-Attribut gesetzt wurde). Es geht in der Ausführung der vorwärts, aber die Seite, nie nach vorn. Ich weiß, das hat etwas zu tun mit der Antwort verpflichtet, da ich getestet, verschiedene Logik, wo es nach vorne, bevor es auf die Kette das erste mal, und es tut sich vorwärts erfolgreich.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
if (some condition equals true) {
httpServletRequest.getRequestDispatcher("/home.jsp").forward(request, response);
return;
} else {
chain.doFilter(request, response);
}
}
Beispiel aus meinem deployment-descriptor:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.filters.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
InformationsquelleAutor | 2010-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den "engagierten" status eines
HttpServletResponse
ist wirklich eine Art zu sagen ob die Antwort-Header geschrieben wurden, um die zugrunde liegende Buchse. Eine "commit" - Antwort hat (mindestens) die erste Zeile geschrieben. Da die erste Zeile enthält die Antwort den status-code, daraus folgt, dass Sie nicht ändern Sie den status-code einer engagierten Antwort ... und das bedeutet, es ist zu spät, um den status zu ändern, um 3xx zu tun eine Umleitung. Ebenso können Sie eine lokale vorwärts, denn Sie haben bereits begonnen senden der Antwort.InformationsquelleAutor Stephen C
Können Sie erreichen, was Sie wollen, indem Sie eine benutzerdefinierte HttpServletResponse. Sie passieren das verpackt HttpServletResponse den filter-Kette. Sie können eine lokale Ausgabestrom, werden alle Schreibzugriffe, lokale Variablen zum speichern der status-code und Header. Sobald Sie wieder in Ihrem filter können Sie dann entscheiden, führen Sie die Umleitung oder zurück kopieren der Ergebnisse von der lokalen Variablen aus der Hülle in die ursprüngliche ServletResponse (d.h. den status-code und header und kopieren Sie die Ergebnisse aus der lokalen stream-Ausgabe in den servlet-response-output-stream).
Edit:
Beziehen sich auf die Programmierung von Kundenspezifischen Anforderungen und Antworten Abschnitt für ein code-Beispiel, bei dem mit einem
CharResponseWrapper
. Das Beispiel verwendet ein benutzerdefiniertes Schriftsteller, aber es kann leicht erweitert werden, um einen Ausgabestrom. Basierend auf den Servlet verwendet wird, müssen Sie zum überschreiben eines oder beidergetWriter()
undgetOutputStream()
Verzögerung zu Begehen, alles auf die original-Antwort. Zusätzlich, Sie werden müssen überschreibenisCommitted()
zurückfalse
, so dass die nach vorne ausgeführt werden kann zu jeder Zeit die filter-chain. Sie müssen auch überschreibenresetBuffer()
initialisiert eine neueOutputStream
/Writer
für das speichern neuer Inhalte (einschließlich Kopfzeilen) nach dem redirect/forward.sample code
auf der Grundlage der/home.jsp
redirect gewünschten über? Ich bin auch Probleme mit diesem Thema. Danke!überprüfen Sie die änderungen in meiner Antwort. Das sollte zusammenfassen, was getan werden muss.
InformationsquelleAutor shams