사용자 정의 HTTP 요청 헤더를 감지하고 파일이 자동으로 다운로드되도록 응답 헤더를 삽입하는 Java "필터"를 만들려고합니다. 이에 가장 중요한 응답 헤더는 "Content-Type = Attachment"응답 헤더입니다.Java 필터가 응답 헤더를 설정하지 못했습니다.
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 헤더가 요청에 삽입됩니다. 그런 다음 그 요청 헤더를 찾는 자바 필터를 가지고 응답 헤더를 설정해야하는 "콘텐츠 유형 = 첨부 파일"
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")를 인쇄하고 실제로 자바 필터에서 올바르게 수신되는지 확인할 수 있습니까? –
예 올바르게 수신 중입니다. 위의 "if"문에서 if (req.getHeader ("X-Wria-Download")! = null) {}은 문을 입력하고 System.out.println에 입력하면 해당 행을 출력합니다. 또한 Content-Disposition을 파일에 적용하지만 Content-Type은 체인에서 덮어 쓰여진 것처럼 보입니다. 필터 단계. 응답은 Content-Disposition을 얻었지만 마치 다운로드 한 것처럼 보이지 않고 pdf를 페이지로 가져옵니다. 또한 "X-Wria-Download"가 Chrome 개발자 도구를 사용할 때 요청 헤더 –
이상하게도 : res.setHeader ("Content-Type", "application/pdf"); res.setHeader ("Content-Disposition", "attachment; filename = success.pdf"); 이 if 문 외부에 놓이면 필터가 작동합니다. 이것은 내가 내 사용자 정의 헤더를 첨부 한 서블릿에만 필터를 적용하기 때문에 내 문제는 해결되지 않습니다. –