Java-filter versagt zu setzen-Antwort-Header
Ich versuche zu erstellen, die ein Java - "Filter", erkennt eine benutzerdefinierte HTTP-Anforderungs-Header und fügt response-Headern, so dass die Datei wird automatisch heruntergeladen werden. Der response-header ist sehr wichtig für diese ist der "Content-Type = Attachment" - header der Antwort. Ich habe erstellt eine HTTP-request-Objekt, fügt die benutzerdefinierten Header:
function myHttpObject(filePath){
function makeHttpObject() {
return new XMLHttpRequest();
}
var request = makeHttpObject();
request.open("GET", filePath, false);
request.setRequestHeader("X-Wria-Download", "PDFdownload");
request.send(null);
window.open(filePath);
console.log(request.getAllResponseHeaders());
}
Diese fügt den X-Wria-Download-header in die Anfrage.
Dann habe ich ein Java-Filter, die sucht, die request-header und der Antwort-header "Content-Type=" Anlage
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Contenttypefilter implements Filter {
protected FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
//noop
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
//get the headers we placed in the request
//based on those request headers, set some response headers
if(req.getHeader("X-Wria-Download") != null){
res.setHeader("Content-Type", "application/pdf");
res.setHeader("Content-Disposition", "attachment; filename=success.pdf");
}
chain.doFilter(req,res);
}
}
Und dann natürlich die web.xml hat den code zum einbinden der Filter auf alle jsp-Dateien.
Ist die Sache, die verwirren mich, ist, dass der header wird auf die Antwort-Datei, aber es ist nicht das herunterladen, wie es sollte. Wenn ich die res.setHeader("Content-Disposition", "attachment; filename=Erfolg.pdf"); Zeile außerhalb der "if" - Anweisung, dann wird es funktionieren, aber es gilt das download-Verhalten für alle JSP ' s, die ich nicht will.
Warum ist es für die Anwendung der content-disposition aber nicht funktioniert, wenn ich die res.setHeader in der if-Anweisung; und dann arbeiten, wenn es außerhalb der if-Anweisung? Irgendwelche Ideen, wie kann ich das gewünschte Verhalten (nur Anwendung von content-disposition-zu jsp ' s, ich habe eine benutzerdefinierte request-header)?
- Sind Sie sicher, dass X-Wria-Download wird korrekt empfangen in Java? Können Sie versuchen, zu drucken, req.getHeader("X-Wria-Download") und sehen, ob es tatsächlich richtig angekommen ist in der Java-filter?
- Ja, es ist, es zu empfangen richtig. In der obigen "if" - Anweisung: if(req.getHeader("X-Wria-Download") != null){} geht es in die Aussage und wenn ich in ein System.aus.println es wird gedruckt, die Zeile aus. Ich gilt auch für die "Content-Disposition", um die Datei, sondern den Content-Type scheint überschrieben, an der Kette.Filterstufe. Auch wenn die Antwort bekommt die "Content-Disposition", es scheint sich nicht zu Verhalten, als wenn Sie es getan hat (nicht heruntergeladen, sondern zieht sich die pdf als eine Seite.) Ich sehe auch die "X-Wria-Download" in den request-header bei der Verwendung von Chrome developer tools.
- Seltsam, wenn: res.setHeader("Content-Type", "application/pdf"); res.setHeader("Content-Disposition", "attachment; filename=Erfolg.pdf"); put ist außerhalb der if-Anweisung, dann wird der filter arbeiten. Dies löst nicht mein problem aber da ich nur wollen, dass der filter angewendet servlets, die ich angehängt habe mein custom-header.
- Hinzugefügt eine Antwort mit meinen Kommentaren über, die.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dein Problem bezieht sich auf die Filter-Reihenfolge der Ausführung Ihrer
Web Context
können, d.h. ein Filter, in der Sie web-Kontext ausgeführt wird, nachdem Sie Ihre filter-und überschreiben der header.Servlet Filter ist eine Implementierung der Kette der Verantwortung Muster
So können Sie versuchen, zu:
.
In dieser Weise Ihr code wird ausgeführt, nachdem die, die das Servlet aufgerufen wird und, wie weiter unten erläutert, wenn Ihr filter ist die erste deklariert web.xml dann die
setHeader
code wird der Letzte sein, der ausgeführt werden soll (siehe Bild unten).Wie Sie sehen können Filter1 (der erste erklärte, im web.xml), wird zuerst ausgeführt, bevor das servlet wird ausgeführt und der Letzte, den Sie ausgeführt nachdem das servlet ausgeführt wird. Also, wenn Sie wollen sicher sein, den letzten Filter festlegen der header deklarieren Sie es als Filter1.
Die Reihenfolge der Ausführung wird bestimmt durch die Reihenfolge der Deklaration in Ihrem Deployment Descriptor (web.xml):
So, um sicher zu sein einfach zu erklären, es als der erste filter in Ihrem
web.xml
. Auf diese Weise wird es das Letzte filter-Einstellungen der Kopfzeile. Und, natürlich, setzen Sie den Kopf in Ihrem code nach dem Aufrufchain.doFilter
, wie schon gesagt.chain.doFilter()
nennen, meine Antwort kommt auch wieder mit den ursprünglichen Werten des headers. Ich habe um mein problem zu lösen in eine andere, weniger wünschenswerte Weg, aber ich bin nur kommentieren, dass diese Antwort für den Fall, jemand anderes hat Probleme auch.web.xml
.Vorausgesetzt, Sie verwenden ein Antwort wrapper wie hier beschrieben von anderen, das ganze Geheimnis ist, Wann getWriter() auf die original-Antwort! Das ist, weil das response-Objekt ignoriert alle Kopfzeilen Hinzugefügt, NACHDEM Sie fragte, für einen Schriftsteller!
Also, stellen Sie sicher, fügen Sie alle Ihre Header, Bevor Sie anrufen getWriter().
Hier ist meine empfohlene Reihenfolge für doFilter():
Erstellen Sie ein Antwort-wrapper
Kette.doFilter (origRequest, wrapper);
Ordnen Sie alle erforderlichen Header der original (!) Antwort
Bekommen Verfasser von original-Antwort
Kopieren Sie den wrapper der Inhalt dieser Schriftsteller
Versuchen Sie dies: ein Attribut auf die Anfrage, wenn die Anfrage-header vorhanden ist. Dann überprüfen Sie für das Attribut nach der
chain.doFilter(...)
und die Antwort-Header dann.Das problem ist der header(X-Wria-Download) von Ihrem AjaxRequest (hier XMLHttpRequest) nicht in Ihrer HttpServletRequest-Objekt, bevor Sie den filter bedient wird.
Ich glaube, eine bessere Idee sein, verwenden Sie einen Dedizierten Servlet, um Ihre ajax-request.