स्प्रिंग एमवीसी में इंटरसेप्टर और फ़िल्टर के बीच अंतर


108

मैं थोड़ा उलझन में हूं Filterऔर Interceptorउद्देश्यों को लेकर।

जैसा कि मैंने डॉक्स से समझा, Interceptorअनुरोधों के बीच चलाया जाता है। दूसरी तरफ Filterदृश्य प्रदान करने से पहले चलाया जाता है, लेकिन नियंत्रक द्वारा प्रतिक्रिया देने के बाद।

तो postHandle()इंटरसेप्टर और doFilter()फ़िल्टर में अंतर कहां है ?

स्प्रिंग एमवीसी किन्नर सबसे अच्छा अभ्यास कौन से मामलों में इसका उपयोग किया जाना चाहिए? इस तस्वीर में Filterएस और Interceptorएस कहाँ काम करता है ?

जवाबों:


87

से HandlerIntercepterकी जावाडोक :

HandlerInterceptorमूल रूप से एक सर्वलेट के समान है Filter, लेकिन बाद के विपरीत यह सिर्फ कस्टम प्री-प्रोसेसिंग को हैंडलर के निष्पादन को प्रतिबंधित करने और कस्टम पोस्ट-प्रोसेसिंग के विकल्प के साथ अनुमति देता है। फिल्टर अधिक शक्तिशाली हैं, उदाहरण के लिए वे अनुरोध और प्रतिक्रिया वस्तुओं का आदान-प्रदान करने की अनुमति देते हैं जो श्रृंखला को सौंप दिया जाता है। ध्यान दें कि एक फिल्टर में विन्यस्त हो जाता है web.xml, एक HandlerInterceptorआवेदन के संदर्भ में।

एक बुनियादी दिशानिर्देश के रूप में, ठीक-ठाक हैंडलर से संबंधित पूर्व-प्रसंस्करण कार्य HandlerInterceptorकार्यान्वयन के लिए उम्मीदवार हैं , विशेष रूप से फैक्टर-आउट कॉमन हैंडलर कोड और प्राधिकरण चेक। दूसरी ओर, Filterअनुरोध सामग्री के लिए अच्छी तरह से अनुकूल है और सामग्री से निपटने और मल्टीपार्ट रूपों और GZIP संपीड़न की तरह देखें। यह आमतौर पर तब दिखाई देता है जब किसी को फ़िल्टर को कुछ सामग्री प्रकारों (जैसे चित्र), या सभी अनुरोधों के लिए मैप करने की आवश्यकता होती है।

उस के साथ कहा जा रहा है:

तो कहाँ Interceptor#postHandle()और के बीच अंतर है Filter#doFilter()?

postHandleहैंडलर विधि आह्वान के बाद बुलाया जाएगा, लेकिन देखने से पहले इसका प्रतिपादन किया जाएगा। तो, आप दृश्य में और अधिक मॉडल ऑब्जेक्ट जोड़ सकते हैं लेकिन आप इसे बदल नहीं सकते HttpServletResponseक्योंकि यह पहले से ही प्रतिबद्ध है।

doFilterकी तुलना में अधिक बहुमुखी है postHandle। आप अनुरोध या प्रतिक्रिया को बदल सकते हैं और इसे श्रृंखला में पास कर सकते हैं या अनुरोध प्रसंस्करण को भी अवरुद्ध कर सकते हैं।

इसके अलावा, preHandleऔर postHandleविधियों में, आपके पास HandlerMethodअनुरोध संसाधित करने की पहुंच है । इसलिए, आप हैंडलर के आधार पर प्री / पोस्ट-प्रोसेसिंग लॉजिक जोड़ सकते हैं। उदाहरण के लिए, आप हैंडलर विधियों के लिए एक तर्क जोड़ सकते हैं जिसमें कुछ एनोटेशन हैं।

सबसे अच्छा अभ्यास कौन से मामलों में इसका उपयोग किया जाना चाहिए?

जैसा कि डॉक्टर ने कहा, ठीक-ठाक हैंडलर से संबंधित पूर्व-प्रसंस्करण कार्य HandlerInterceptorकार्यान्वयन के लिए उम्मीदवार हैं , विशेष रूप से फैक्टर-आउट कॉमन हैंडलर कोड और प्राधिकरण चेक। दूसरी ओर, Filterअनुरोध सामग्री के लिए अच्छी तरह से अनुकूल है और सामग्री से निपटने और मल्टीपार्ट रूपों और GZIP संपीड़न की तरह देखें। यह आमतौर पर तब दिखाई देता है जब किसी को फ़िल्टर को कुछ सामग्री प्रकारों (जैसे चित्र), या सभी अनुरोधों के लिए मैप करने की आवश्यकता होती है।


ध्यान दें कि फ़िल्टर web.xml में कॉन्फ़िगर हो जाता है, अनुप्रयोग संदर्भ में एक हैंडलरइंटरसेप्टर ??? क्या आप समझा सकते हैं?

4
फ़िल्टर सर्वलेट एपीआई से संबंधित है और HandlerIntercepterएक स्प्रिंग विशिष्ट अवधारणा है। सर्वलेट फ़िल्टर को पंजीकृत करने के लिए, आप पुराने web.xml(सर्वलेट 2.5 और पुराने संस्करणों) या नए प्रोग्रामेटिक दृष्टिकोण (सर्वलेट 3+) का उपयोग करके या तो इसे पंजीकृत कर सकते हैं । चूंकि HandlerIntercepterयह सिर्फ एक स्प्रिंग एब्स्ट्रैक्शन है, इसलिए आपको स्प्रिंग के संदर्भ में पंजीकरण करना चाहिए
अली देहगानी

फ़िल्टर सर्वलेट एपीआई से संबंधित है और हैंडलरइंटरसेप्टर एक स्प्रिंग विशिष्ट अवधारणा है। coorect! लेकिन web.xml द्वारा जो भी उर रजिस्टरिंग किया जाता है WebApplication, वह प्रति डिस्पैचर में से एक है, इसलिए सर्वलेट और फ़िल्टर दोनों संदर्भ से जुड़े हुए होते हैं, यह इंटरसेप्टर को जोड़ने और फ़िल्टर करने के लिए एक अच्छा अभ्यास है, rootContextअगर यू hv मल्टीपल डिस्पैचर सभी को एक ही साझा कर सकते हैं।

9

फ़िल्टर : - जैसा कि नाम से ही पता चलता है कि प्रत्येक आने वाली HTTP रिक्वेस्ट के लिए और प्रत्येक http रिस्पॉन्स के लिए सर्वलेट कंटेनर द्वारा निष्पादित जावा क्लास है। इस तरह, संसाधन तक पहुँचने से पहले HTTP आवक अनुरोधों को प्रबंधित करना संभव है, जैसे कि JSP पेज, एक सर्वलेट या एक साधारण स्टेटिक पेज; उसी तरह संसाधन निष्पादन के बाद HTTP आउटबाउंड प्रतिक्रिया का प्रबंधन करना संभव है।

इंटरसेप्टर : - स्प्रिंग इंटरसेप्टर सर्वलेट फिल्टर के समान होते हैं, लेकिन वे स्प्रिंग कॉनटेक्स्ट में कार्य करते हैं इसलिए HTTP रिक्वेस्ट और रिस्पांस को प्रबंधित करने के लिए कई शक्तिशाली हैं लेकिन वे अधिक परिष्कृत व्यवहार को लागू कर सकते हैं क्योंकि सभी स्प्रिंग संदर्भ तक पहुंच सकते हैं।


2
स्रोत: mkjava.com/tutorial/filter-vs-interceptor को स्रोत का उल्लेख करना होगा
प्रेमराज

वसंत सुरक्षा फ़िल्टर के बारे में क्या है, यह आपको वसंत संदर्भ भी देता है।
लविन

6

एक हैंडलरइंटरसेप्टर आपको फिल्टर की तुलना में अधिक महीन दाने वाला नियंत्रण देता है, क्योंकि आपके पास वास्तविक लक्ष्य "हैंडलर" तक पहुंच होती है - इसका मतलब यह है कि आप जो भी कार्य करते हैं वह वास्तव में अनुरोध के आधार पर भिन्न हो सकता है (जबकि सर्वलेट फ़िल्टर उदारतापूर्वक लागू होता है) सभी अनुरोधों के लिए - केवल प्रत्येक अनुरोध के मापदंडों को ध्यान में रखने में सक्षम)। हैंडलरइंटरसेप्टर 3 अलग-अलग तरीके भी प्रदान करता है, ताकि आप हैंडलर को कॉल करने से पहले व्यवहार को लागू कर सकें, हैंडलर के पूरा होने के बाद लेकिन रेंडरिंग देखने से पहले (जहां आप पूरी तरह से रेंडरिंग को देख सकते हैं), या व्यू के बाद खुद को प्रस्तुत किया गया है। इसके अलावा, आप हैंडलर के विभिन्न समूहों के लिए अलग-अलग इंटरसेप्टर सेट कर सकते हैं - इंटरसेप्टर हैंडलर मैपिंग पर कॉन्फ़िगर किए गए हैं, और कई हैंडलर मैपिंग हो सकते हैं।

इसलिए, यदि आपको कुछ पूरी तरह से सामान्य करने की आवश्यकता है (जैसे सभी अनुरोधों को लॉग करें), तो एक फिल्टर पर्याप्त है - लेकिन यदि व्यवहार लक्ष्य हैंडलर पर निर्भर करता है या आप अनुरोध को संभालने और देखने के बीच कुछ करना चाहते हैं, तो प्रतिपादन हैंडलरइंटरसेप्टर उस लचीलेपन को प्रदान करता है।

संदर्भ: http://static.springframework.org/sp...ng-interceptor


2
लिंक टूट गया है।
जेसन लॉ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.