2009-04-02 5 views
0

Ich weiß nicht, aber ich fühle, dass Illegal verursacht Kopfschmerzen rückgängig gemacht werden. Wenn ich eine Anfrage habe, sage eine JSP oder ein anderes Servlet und muss dieser Anfrage einen Filter zuordnen. Ich kann keine anderen Änderungen an der Ausgabe an den Client vornehmen, wenn die Antwort bereits festgeschrieben wurde?Vermeiden von Illegal in Java/Servlet Web Stack

Zum Beispiel sehe ich im JSP-Code, der den Mimetyp response.setContent ("html") setzt und dann habe ich einen Filter mit der JSP, der den Mimetyp auf etwas setzen muss sonst. setContent ("Bild") oder "xhtml". Aber ich bekomme eine IllegalStateException?

Gibt es eine Möglichkeit, die vorherige Antwort zu löschen, die begangen wurde, oder gibt es etwas, um dieses Problem zu vermeiden.

Dies ist auf Websphere.

Antwort

2

Ich glaube, Sie überdenken müssen, wie Sie die Vorbereitung und Ihre Antworten zurück. Sie können nicht in die Antwort schreiben (welche können schreiben Sie an den Client) und dann Ihre Meinung ändern.

Abgesehen von der Frage, warum Ihre Lösung hat den Rückgabetyp zu ändern, würde ich bis zu einem gewissen Dummy-Containerobjekt mit dem Rückgabedatum + Art, schreiben und diese wandelbar machen. Nur wenn Ihr Servlet seine Arbeit abgeschlossen hat, würden Sie dann dieses Objekt (Typ + Inhalt) in den Ausgabestrom schreiben.

(zu klären, ich glaube nicht, Servlet-Filter der richtige Ansatz dafür sind. Sie werden die Anforderung abzufangen, und die Antwort, aber die Antwort Bevölkerung liegt in der Verantwortung des Servlets)

+0

Das ist in Ordnung, aber es gibt so viel in der J2EE-Welt, die auch die Antwort ändern kann. Das macht es mir unmöglich, Output Mimetypen und andere solche Dinge zu ändern. –

+0

Hier ist der Haken (oder eine Frage zu berücksichtigen). An welchem ​​Punkt wird die Ausgabe an den Client (den Browser) geschrieben. Denn sobald es soweit ist, gibt es kein Zurück :-) Das ist der Grund, warum das Antwortobjekt es nicht erlaubt, Attribute etc. zu ändern. –

+0

Stellen Sie sich vor, Sie hätten eine JSP. Sie haben einen Filter für diesen JSP. Abhängig von dem, was der Filter tut, können Sie eine response.sendRedirect tun. In Websphere 5.1, anscheinend die JSP, schreibt standardmäßig das resp und setzt den mimetype. IllegalState wenn auf sendRedierct –

0

Ihre Prämisse Führen Sie einen JSP aus, der HTML ausgibt, und haben Sie dann einen Filter, der den Inhaltstyp zu etwas anderem wie Bild ändert, das in der gleichen Antwort keinen Sinn macht. Eine Antwort kann nur ein einzelnes Artefakt zurückgeben, sei es eine HTML-Datei oder ein Bild. Es gibt keine Möglichkeit, beide innerhalb derselben Antwort zurückzugeben - jeder Versuch, dies zu tun, ist Unsinn. Es macht keinen Sinn, etwas HTML mit binär angeheftetem Bild zu senden. Der Inhaltstyp gilt für die gesamte Antwort. Sie können nicht mehrere Dinge in der einen Antwort verpacken.

Manchmal kann man resetBuffer(), wenn der Ausgang nicht die Puffergröße überschritten. Der beste Ansatz ist, diese Einrichtung zu vermeiden und zu entscheiden, was zu tun ist, bevor Sie beginnen, eine Antwort auszugeben.

+0

das ist genau das, was ich tue . Ich benutze ein html, um ein Parsing-Werkzeug zu erstellen, um ein HTML-Eingabedokument aufzunehmen und dieses Dokument dann an das Bild auszugeben. Es funktioniert für einige Dienste, aber für einige Dienste nicht. https://xhtmlrenderer.dev.java.net/ –

1

Ich stimme den anderen Plakaten zu, dass dies hässlich ist, aber Sie können einen HttpServletResponseWrapper in Ihrem Filter erstellen, der die Ausgabe entführen würde und übergeben Sie diesen Wrapper an die Kette anstelle des ursprünglichen Antwortobjekts.

+0

Ich mache das, und das ist, wo ich den Fehler bekomme. Zu irgendeinem Zeitpunkt am Anfang der Filterkette, wenn ich den MIME-Typ eingestellt habe, kann ich ihn am Ende der Kette nicht ändern. –

+0

Nun, ich denke, Sie müssten auch den SetContentType entführen –