カスタムHTTPリクエストヘッダーを検出し、ファイルが自動的にダウンロードされるようにレスポンスヘッダーを挿入するJava「フィルター」を作成しようとしています。このために最も重要な応答ヘッダーは、"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 ヘッダーがリクエストに挿入されます。次に、そのリクエスト ヘッダーを検索し、レスポンス ヘッダーを「Content-Type=attachment」に設定する必要がある 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 がある場合、content-disposition を適用しても機能しないのはなぜですか。if ステートメントの外にあるときに動作しますか? 目的の動作を実現する方法についてのアイデアはありますか (カスタム リクエスト ヘッダーを適用した JSP にのみコンテンツの処理を適用します)。