我正在尝试创建一个 Java“过滤器”,它检测自定义 HTTP 请求标头,并插入响应标头,以便文件自动下载。对此最重要的响应标头是“Content-Type = Attachment”响应标头。我创建了一个插入自定义标头的 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)?