Java-Filter konnte Antwort-Header nicht setzen

8

Ich versuche, einen Java-Filter zu erstellen, der einen benutzerdefinierten HTTP-Anfrage-Header erkennt und Antwort-Header einfügt, so dass die Datei automatisch heruntergeladen wird. Der Antwortheader, der am wichtigsten ist, ist der Antwortheader "Content-Type = Attachment". Ich habe ein HTTP-Anfrageobjekt erstellt, das den benutzerdefinierten Header einfügt:

%Vor%

Dies fügt den X-Wria-Download-Header in die Anfrage ein. Dann habe ich einen Java-Filter, der nach diesem Anfrage-Header sucht und den Antwort-Header auf "Content-Type = Anhang" setzen sollte

%Vor%

Und dann hat die web.xml natürlich den Code, der den Filter für alle jsp-Dateien enthält.

Die Sache, die mich verblüfft, ist, dass der Header auf die Antwortdatei gesetzt wird, aber nicht so heruntergeladen wird, wie es sollte. Wenn ich den res.setHeader ("Content-Disposition", "Anhang; Dateiname = success.pdf"); Zeile außerhalb der "if" -Anweisung, dann wird es funktionieren, aber es wird das Download-Verhalten auf alle JSPs anwenden, die ich nicht will.

Warum wendet es die Inhaltsdisposition an, funktioniert aber nicht, wenn ich den res.setHeader in der if-Anweisung habe; und dann arbeiten, wenn es außerhalb der if-Anweisung ist? Irgendwelche Ideen, wie ich das gewünschte Verhalten bekommen kann (nur die Inhaltsdisposition auf JSPs anwenden, auf die ich einen benutzerdefinierten Anforderungsheader angewendet habe)?

    
Sol Slay 19.11.2012, 20:18
quelle

4 Antworten

11

Ich denke, Ihr Problem hängt mit der Filterreihenfolge der Ausführung von Web Context zusammen, d. h. einige Filter in Ihrem Webkontext werden nach Ihrem Filter ausgeführt und überschreiben den Header.

Das Servlet Filter ist eine Implementierung von Verantwortlichkeit Muster

Sie können also versuchen:

  • Legen Sie die Header nach dem Aufruf von chain.doFilter:
  • fest

.

%Vor%

Auf diese Weise wird Ihr Code ausgeführt, nachdem das Servlet aufgerufen wurde und, wie unten erklärt, wenn Ihr Filter der erste in web.xml ist, wird der setHeader Code der zuletzt ausgeführte sein (siehe Bild unten) ).

  • stelle sicher, dass dein Filter der letzte ist, der ausgeführt wird, nachdem das Servlet ausgeführt wurde, dh es sollte der erste Servlet-Filter sein, der wie erklärt erklärt wurde hier :

Wie Sie sehen können, ist Filter1 (der erste, der in web.xml deklariert wurde) der erste, der ausgeführt wird, bevor das Servlet ausgeführt wird, und der letzte, der ausgeführt wird, nachdem das Servlet ausgeführt wurde. Wenn Sie sicher sein wollen, dass Sie der letzte Filter sind, der den Header setzt, dann deklarieren Sie ihn als Filter1.

Die Reihenfolge der Ausführung wird durch die Reihenfolge der Deklaration in Ihrem Implementierungsdeskriptor (web.xml) festgelegt:

  

Servlet-Spezifikation (Abschnitt 6.2.4):

     

"Die Reihenfolge, in der der Container beim Aufbau der Filterkette verwendet wird   Für eine bestimmte Anfrage URI gilt wie folgt:

     

"1. Zuerst die passenden Filterzuordnungen in der gleichen   Ordnen Sie diese Elemente im Deployment-Deskriptor an.

     

"2. Als nächstes stimmen die übereinstimmenden Filterzuordnungen überein   Ordnen Sie diese Elemente im Deployment-Deskriptor an. "

Also deklariere es einfach als ersten Filter in deinem web.xml . Auf diese Weise wird der allerletzte Filter den Header setzen. Und natürlich, setzen Sie den Header in Ihrem Code nach dem Aufruf von chain.doFilter , wie bereits gesagt.

    
Tony Rad 20.11.2012 22:09
quelle
3

Angenommen, Sie verwenden einen Antwort-Wrapper, wie hier von anderen beschrieben, ist das ganze Geheimnis, wenn getWriter () auf die ursprüngliche Antwort aufgerufen werden soll! Das liegt daran, dass das Antwortobjekt alle hinzugefügten Header ignoriert, NACHDEM du nach einem Schreiber gefragt hast!

Stellen Sie also sicher, dass Sie alle Header hinzufügen, bevor Sie getWriter () aufrufen. Hier ist meine empfohlene Sequenz für doFilter ():

  1. Erstellen Sie einen Antwortwrapper

  2. chain.doFilter (origRequest, Wrapper);

  3. Ordnen Sie der ursprünglichen (!) Antwort

  4. alle erforderlichen Header zu
  5. Erhalte Writer aus der ursprünglichen Antwort

  6. Kopieren Sie den Inhalt des Wrappers in diesen Writer

Adi Degani 06.09.2017 05:33
quelle
0

Versuchen Sie Folgendes: Legen Sie ein Attribut für die Anforderung fest, wenn der Anforderungsheader vorhanden ist. Überprüfen Sie dann das Attribut nach dem chain.doFilter(...) und setzen Sie die Antwortheader dann.

    
Akber Choudhry 19.11.2012 21:57
quelle
0

Das Problem ist, dass der Header (X-Wria-Download) Ihres AjaxRequest (hier XMLHttpRequest) nicht in Ihrem HttpServletRequest-Objekt gesetzt wird, bevor der Filter geliefert wird.

Ich denke, bessere Idee wird sein, ein dediziertes Servlet zu verwenden, um deine ajax Anfrage zu behandeln .

    
Sazzadur Rahaman 20.11.2012 04:16
quelle