Tôi đang cố gắng tạo Bộ lọc "Java" để phát hiện Tiêu đề yêu cầu HTTP tùy chỉnh và chèn tiêu đề phản hồi để tệp sẽ tự động tải xuống. Tiêu đề phản hồi quan trọng nhất cho tiêu đề này là tiêu đề phản hồi "Content-Type = Attachment". Tôi đã tạo đối tượng yêu cầu HTTP chèn Tiêu đề tùy chỉnh:Bộ lọc Java không đặt tiêu đề phản hồi
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());
}
Điều này sẽ chèn tiêu đề X-Wria-Tải xuống vào yêu cầu. Sau đó, tôi có một bộ lọc Java trông cho rằng tiêu đề yêu cầu và nên đặt tiêu đề đối phó với "Content-Type = đính kèm"
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);
}
}
Và sau đó tất nhiên web.xml có mã để bao gồm các bộ lọc trên tất cả các tệp jsp.
Điều khiến tôi bối rối, là tiêu đề đang được đặt trên tệp phản hồi, nhưng nó không tải xuống như nó cần. Nếu tôi đặt res.setHeader ("Content-Disposition", "attachment; filename = success.pdf"); dòng bên ngoài câu lệnh "if", sau đó nó sẽ hoạt động, nhưng nó sẽ áp dụng hành vi tải xuống cho tất cả các JSP mà tôi không muốn.
Tại sao nó áp dụng bố cục nội dung nhưng không hoạt động khi tôi có res.setHeader trong câu lệnh if; và sau đó làm việc khi nó nằm ngoài câu lệnh if? Bất kỳ ý tưởng nào về cách tôi có thể có được hành vi mong muốn (chỉ áp dụng bố cục nội dung cho jsp là tôi đã áp dụng tiêu đề yêu cầu tùy chỉnh cho)?
Bạn có chắc chắn rằng X- Wria-Download được nhận đúng trong Java? Bạn có thể thử in req.getHeader ("X-Wria-Download") và xem liệu nó có thực sự được nhận chính xác trong bộ lọc Java không? –
Có nhận được chính xác. Trong câu lệnh "if" ở trên: if (req.getHeader ("X-Wria-Download")! = Null) {}, nó sẽ đi vào câu lệnh và nếu tôi đặt trong System.out.println nó sẽ in dòng đó ra. Tôi cũng áp dụng Content-Disposition cho tệp, nhưng Content-Type dường như bị ghi đè ở giai đoạn chain.Filter. Mặc dù phản hồi nhận được Nội dung-Bố trí, nó dường như không hành xử như thể nó đã làm (không tải xuống, nhưng thay vì kéo lên pdf như một trang.) Tôi cũng thấy "X-Wria-Download" trong tiêu đề yêu cầu khi sử dụng các công cụ dành cho nhà phát triển Chrome. –
Kỳ lạ nếu: res.setHeader ("Content-Type", "application/pdf"); res.setHeader ("Nội dung-Bố trí", "tệp đính kèm; tên tệp = success.pdf"); được đặt bên ngoài câu lệnh if, sau đó bộ lọc sẽ hoạt động. Điều này không giải quyết vấn đề của tôi mặc dù kể từ khi tôi chỉ muốn các bộ lọc áp dụng cho servlets mà tôi đã đính kèm tiêu đề tùy chỉnh của tôi để. –