我正在嘗試創建一個Java「過濾器」,它檢測自定義HTTP請求標頭並插入響應標頭,以便該文件自動下載。最重要的響應頭是「Content-Type = Attachment」響應頭。我已經創建了插入自定義首部的HTTP請求對象:Java過濾器無法設置響應標頭
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());
}
這將插入的X Wria-下載報頭插入到所述請求。 然後我有一個Java過濾器,其將查找請求報頭和應設置響應頭爲「內容類型=附件」
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);
}
}
然後當然web.xml中具有代碼在包括過濾器所有的jsp文件。
讓我感到困惑的是,頭文件被設置在響應文件中,但它並沒有像應該那樣下載。如果我把res.setHeader(「Content-Disposition」,「attachment; filename = success.pdf」);在「if」語句之外,那麼它將起作用,但它會將下載行爲應用於我不想要的所有JSP。
爲什麼它在if語句中使用res.setHeader時應用內容處置,但不工作;然後在if語句之外工作?關於如何獲得所需行爲的任何想法(僅向我申請自定義請求標頭的jsp應用內容處置)?
你肯定X- Wria-Download在Java中正確接收?您能否嘗試打印req.getHeader(「X-Wria-Download」)並查看它是否在Java過濾器中正確接收? –
是的,它正確地接收它。在上面的「if」語句中:if(req.getHeader(「X-Wria-Download」)!= null){}它輸入語句,如果我放入一個System.out.println它將打印出該行。我也將Content-Disposition應用於文件,但Content-Type似乎在chain.Filter階段被覆蓋。儘管響應獲得了Content-Disposition,但它似乎並不像它那樣工作(不下載,而是將pdf作爲頁面提取。)我還看到了「X-Wria-Download」使用Chrome開發人員工具時的請求標題。 –
奇怪如果: res.setHeader(「Content-Type」,「application/pdf」); res.setHeader(「Content-Disposition」,「attachment; filename = success.pdf」); 放在if語句之外,那麼過濾器將工作。這並不能解決我的問題,但是因爲我只想將過濾器應用於我附加了自定義標頭的servlet。 –