【发布时间】:2012-11-07 19:54:18
【问题描述】:
我正在尝试创建一个 Java“过滤器”,它检测自定义 HTTP 请求标头,并插入响应标头,以便文件自动下载。对此最重要的响应标头是“Content-Type = Attachment”响应标头。我创建了一个插入自定义 Header 的 HTTP 请求对象:
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-Download 标头插入到请求中。 然后我有一个 Java 过滤器,它会查找该请求标头并将响应标头设置为“Content-Type=attachment”
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。
-
向我的 cmets 添加了一个关于此的答案。
标签: java servlets http-headers request servlet-filters