PDF文件未完成下载“后装载”。它由完全独立的HTTP请求下载,该请求在页面加载后启动。您可能会在所需的URL模式上映射过滤器,并在chain.doFilter()
调用后执行作业。但这有点奇怪。
我知道您正在生成只在提交时才会显示的PDF报告。在这种情况下,您应该创建一个单独的servlet,它基于某些请求参数生成PDF,并将其直接写入响应输出流而不是文件输出流。最后,让JSF使用正确的请求参数为该servlet生成正确的URL。
E.g.
public void submit() {
// ...
path = externalContext.getRequestContextPath() + "/pdf"
+ "?foo=" + URLEncoder.encode(foo, "UTF-8")
+ "?bar=" + URLEncoder.encode(bar, "UTF-8")
+ "?baz=" + URLEncoder.encode(baz, "UTF-8");
}
和这样一个servlet(假定你正在利用iText生成PDF):
@WebServlet("/pdf/*")
public class PdfServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String foo = request.getParameter("foo");
String bar = request.getParameter("bar");
String baz = request.getParameter("baz");
// ...
response.setContentType("application/pdf");
PdfWriter.getInstance(document, response.getOutputStream());
// ...
}
}
如果你想隐藏的请求参数的时候,你可以备选地也存储它们在会话中通过自动生成的/唯一的ID并将其作为请求参数传递。