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並將其作爲請求參數傳遞。