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)?
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:
.
%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) ).
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.
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 ():
Erstellen Sie einen Antwortwrapper
chain.doFilter (origRequest, Wrapper);
Ordnen Sie der ursprünglichen (!) Antwort
Erhalte Writer aus der ursprünglichen Antwort
Kopieren Sie den Inhalt des Wrappers in diesen Writer
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.
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 .
Tags und Links java servlets http-headers request servlet-filters