मैं एक जावा "फ़िल्टर" बनाने की कोशिश कर रहा हूं जो एक कस्टम 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());
}
यह अनुरोध में एक्स-Wria-डाउनलोड हैडर से जोड़ दिया जाएगा: मैं एक HTTP अनुरोध वस्तु है कि कस्टम हैडर सम्मिलित करता है बनाया है। तो मैं एक जावा फ़िल्टर जो कि अनुरोध हेडर के लिए दिखता है और प्रतिक्रिया हेडर स्थापित करना चाहिए करने के लिए "सामग्री प्रकार = लगाव"
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 पर फ़िल्टर शामिल करने के लिए कोड है सभी जेएसपी फाइलें।
जो चीज मुझे परेशान कर रही है, वह यह है कि हेडर प्रतिक्रिया फ़ाइल पर सेट किया जा रहा है, लेकिन यह डाउनलोड नहीं हो रहा है। अगर मैं res.setHeader डालता हूं ("सामग्री-विस्थापन", "अनुलग्नक; फ़ाइल नाम = success सफलतापूर्वक पीडीएफ"); "if" कथन के बाहर लाइन, तो यह काम करेगी, लेकिन यह सभी जेएसपी के डाउनलोड व्यवहार को लागू करेगी जो मैं नहीं चाहता हूं।
यह सामग्री-स्वभाव क्यों लागू कर रहा है लेकिन जब मेरे पास res.setHeader है तो कथन में काम नहीं कर रहा है; और उसके बाद काम करते समय यह कथन के बाहर है? किसी भी विचार के लिए कि मैं वांछित व्यवहार कैसे प्राप्त कर सकता हूं (केवल jsp के लिए सामग्री स्वभाव लागू कर रहा हूं जिसे मैंने कस्टम अनुरोध शीर्षलेख लागू किया है)?
आप यह सुनिश्चित करें कि कर रहे हैं एक्स जावा में Wria-डाउनलोड सही ढंग से प्राप्त किया गया है? क्या आप req.getHeader ("X-Wria-डाउनलोड") प्रिंट करने का प्रयास कर सकते हैं और देख सकते हैं कि जावा फ़िल्टर में वास्तव में यह सही ढंग से प्राप्त हुआ है या नहीं? –
हां यह सही ढंग से प्राप्त कर रहा है। उपर्युक्त "अगर" कथन में: यदि (req.getHeader ("X-Wria-डाउनलोड")! = Null) {} यह कथन में प्रवेश करता है और यदि मैं System.out.println डालता हूं तो यह उस पंक्ति को प्रिंट करेगा। मैं फ़ाइल में सामग्री-विस्थापन भी लागू करता हूं, लेकिन सामग्री-प्रकार श्रृंखला में ओवरराइट हो जाता है। फ़िल्टर चरण। भले ही प्रतिक्रिया सामग्री-विस्थापन प्राप्त करती है, ऐसा लगता है कि ऐसा नहीं होता है (डाउनलोड नहीं करता है, बल्कि पेज के रूप में पीडीएफ खींचता है।) मुझे "एक्स-व्रिया-डाउनलोड" भी दिखाई देता है क्रोम डेवलपर टूल का उपयोग करते समय अनुरोध हेडर। –
आश्चर्यजनक रूप से यदि: res.setHeader ("सामग्री-प्रकार", "एप्लिकेशन/पीडीएफ"); res.setHeader ("सामग्री-विस्थापन", "अनुलग्नक; filename = success.pff"); अगर कथन के बाहर रखा गया है, तो फ़िल्टर काम करेगा। यह मेरी समस्या का समाधान नहीं करता है, हालांकि मैं केवल उन फ़िल्टरों पर लागू फ़िल्टर चाहता हूं जिन्हें मैंने अपना कस्टम हेडर संलग्न किया है। –