2015-09-28 12 views
6

मुझे प्रत्येक प्रतिक्रिया में शीर्षलेख जोड़ने की आवश्यकता है। मैं इतना है कि नियंत्रक प्रक्रिया एक बार यह, मैं सिर्फ हैडर ग्राहक के लिए लौटने से पहले जोड़ने के लिए नीचे दिए गएफ़िल्टर में प्रतिक्रिया में हेडर जोड़ना?

public class MyFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
            HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 

     filterChain.doFilter(request, response); 
      response.addHeader("Access-Control-Allow-Origin", "*"); 
    } 

} 

करने के लिए मैं filterChain.doFilter(request, response) के बाद यह करना चाहते हैं योजना बना रहा हूँ। क्या यह सही है ?

लेकिन How to write response filter?

अनुसार chain.doFilter के बाद वापस आ गया है, यह प्रतिक्रिया के साथ कुछ भी करने को बहुत देर हो चुकी है। इस बिंदु पर, पूरी प्रतिक्रिया पहले ही क्लाइंट को भेजी गई थी और आपके कोड के पास इसका कोई उपयोग नहीं है।

उपरोक्त कथन मेरे लिए सही नहीं लग रहा है। क्या मैं filterChain.doFilter(request, response) के बाद हेडर जोड़ नहीं सकता? यदि नहीं क्यों?

मैं वसंत एमवीसी का उपयोग कर रहा हूं।

+0

क्या आप फ़िल्टर के बजाय स्प्रिंग एमवीसी इंटरसेप्टर का उपयोग नहीं कर सकते? –

उत्तर

10

filterChain.doFilter के बाद प्रतिक्रिया के साथ कुछ भी करने में बहुत देर हो चुकी है। इस बिंदु पर, पूरी प्रतिक्रिया पहले से ही ग्राहक को भेजी गई थी।

आपको अपनी कक्षाओं में एक रैप प्रतिक्रिया बनाने की आवश्यकता है, इन रैपर को doFilter विधि में पास करें और अपने रैपर में किसी भी प्रसंस्करण को संभालें।

पहले से ही एक प्रतिक्रिया रैपर है: HttpServletResponseWrapper जिसे आप बढ़ा सकते हैं।

public class MyResponseRequestWrapper extends HttpServletResponseWrapper{ 
    public MyResponseRequestWrapper(HttpServletResponse response) { 
     super(response); 
    } 
} 

आपका फ़िल्टर: उदाहरण के लिए:

@Override 
protected void doFilterInternal(HttpServletRequest request, 
           HttpServletResponse response, FilterChain filterChain) 
     throws ServletException, IOException { 

    HttpServletResponse myResponse = (HttpServletResponse) response; 
    MyResponseRequestWrapper responseWrapper = new MyResponseRequestWrapper(myResponse); 
    responseWrapper.addHeader("Access-Control-Allow-Origin", "*"); 
    filterChain.doFilter(request, myResponse); 
} 
+0

कंटेनर द्वारा पारित मूल कार्यान्वयन में केवल शीर्षलेख जोड़ने के बजाय अपने उदाहरण में रैपर का उपयोग क्यों करें? मुझे लगता है कि रैपर केवल तभी समझ में आता है जब आप यह सुनिश्चित करने के लिए अंदर कुछ तर्क लागू करते हैं कि आपका हेडर फ़िल्टर श्रृंखला के नीचे कहीं भी हटाया/ओवरराइट नहीं किया जाएगा। – troy

0

From perfect article

कि एक प्रतिक्रिया को संशोधित करता है आमतौर पर प्रतिक्रिया पर कब्जा करने से पहले यह ग्राहक के लिए दिया जाता है एक फिल्टर। ऐसा करने के लिए, आप उस प्रतिक्रिया को उत्पन्न करने वाले सर्वलेट में स्टैंड-इन स्ट्रीम पास करते हैं। स्टैंड-इन स्ट्रीम सर्लेट को मूल प्रतिक्रिया स्ट्रीम को बंद करने से रोकती है जब यह पूर्ण हो जाती है और फ़िल्टर को सर्वलेट की प्रतिक्रिया को संशोधित करने की अनुमति देता है।

इस स्टैंड-इन स्ट्रीम को सर्वलेट में पास करने के लिए, फ़िल्टर एक प्रतिक्रिया रैपर बनाता है जो getWriter को ओवरराइड करता है या इस स्टैंड-इन स्ट्रीम को वापस करने के लिए आउटपुटस्ट्रीम विधि प्राप्त करता है। रैपर फिल्टर श्रृंखला के doFilter विधि को पारित किया जाता है। लपेटा अनुरोध या प्रतिक्रिया वस्तु के माध्यम से कॉल करने के लिए रैपर विधियों डिफ़ॉल्ट। यह दृष्टिकोण डिज़ाइन पैटर्न में वर्णित प्रसिद्ध रैपर या सजावटी पैटर्न का पालन करता है,

संबंधित मुद्दे