2011-01-03 6 views
1

Was ist der Grund für diese Ausnahme bei der Weiterleitung der Anfrage? Der Grund für die Ausnahme bei response.redirect ist, dass ein 30x Redirect-Response-Header nicht ausgegeben werden kann, nachdem ein Teil des Response-Hauptteils in den Ausgabestream übertragen wurde. Aber ich sehe den Grund dafür nicht auf einem internen Forward. Der Anwendungsfall, den ich mir vorstelle, ist es, den HTML - Inhalt von Filtern zu entfernen, so dass der Browser einen Vorsprung (Wortspiel) auf dem oberen CSS und Javascript bekommen kann, während das Servlet sein Backend arbeitet, bevor es an einen Präsentation jsp. Indem ich das erste Byte früher erhalte, hoffe ich, einen Leistungsvorteil auf der Client-Seite zu sehen.Warum wirft die Servlet-API IllegalStateException beim Weiterleiten einer Anfrage nach dem Schreiben in die Antwort?

Struts und andere Frameworks hängen von Vorwärtsversand ab. Aufgrund dieser Weiterleitungen können wir Antwortinhalte gemäß der API nicht frühzeitig löschen.

http://download.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)

Antwort

1

Denn den Fall vorstellen, wenn Sie einige <head> Definitionen an den Browser senden, und dann nach vorne auf eine Seite, die ganz anders ist. Das Ergebnis wird eine vermasselte Seite sein. Mit (vielleicht) zwei Abschnitten, von denen einer irrelevant ist.

Sie können requestDispatcher.include(..) verwenden, um das Ergebnis einer anderen Seite einzuschließen, anstatt es weiterzuleiten.

+0

Danke für das gute Beispiel. Ist das normalerweise der Fall, wenn Sie auf eine "andere" Seite weiterleiten, oder würden Sie normalerweise eine Seite für eine bestimmte Anfrage vervollständigen? Ich sehe, wie Sie sich in Schwierigkeiten bringen können, aber es scheint keine IllegalStateException zu erfordern, da es im Gegensatz zu der Umleitung nach der Groß-/Kleinschreibung, die immer ungültig ist, zu einem vollkommen gültigen Ergebnis führen kann. Ihre Erklärung scheint fair zu sein, obwohl mir die Regel etwas zu streng erscheint. –

+0

@Joe Hanink - Der Servlet-Container kann nicht feststellen, ob die Ausgabe gültig ist oder nicht. Daher meldet es immer ein Problem. Siehe mein Update BTW – Bozho

+0

das ist wahr, aber es ist nicht gültig oder ungültig aufgrund der Weiterleitung, sondern aufgrund des Inhalts. Ich könnte genauso einfach jsp: Inhalt zweimal enthalten. Ich nehme an, dass die Servlet-API-Autoren auf der Seite der Sicherheit Fehler machen, wo sie können, aber es scheint, dass es einen Hauptunterschied zwischen Inhaltskontrolle auf Seitenebene und HTTP-Header-Integrität gibt. Es scheint, Response Redirects nach Antwort Commit ist eine wahre API Level illegaler Zustand, während Multiplikation einschließlich einer -Tag ist nur ein Programmierfehler auf Anwendungsebene. Auf jeden Fall, danke für Ihre Eingabe. Es ist so gut wie jede andere Erklärung. –

Verwandte Themen