फ़िल्टर (फ़िल्टर) क्या है?
फ़िल्टर J2EE मानक विनिर्देश सुविधा है जो डिस्पैचर सर्वलेट (डिस्पैचर सर्वलेट) को अनुरोध भेजे जाने से पहले/बाद में url पैटर्न से मेल खाने वाले सभी अनुरोधों के लिए अतिरिक्त कार्य संसाधित कर सकता है। दूसरे शब्दों में, यह स्प्रिंग कंटेनर द्वारा नहीं बल्कि टॉमकैट जैसे वेब कंटेनर द्वारा प्रबंधित किया जाता है, इसलिए यह डिस्पैचर सर्वलेट पर जाने से पहले अनुरोध को संसाधित करता है।
फ़िल्टर (फ़िल्टर) कार्यान्वयन
फ़िल्टर जोड़ने के लिए, आपको javax.servlet के फ़िल्टर इंटरफ़ेस को लागू करना होगा, जिसमें निम्नलिखित तीन विधियाँ हैं।
- init विधि
- यह विधि फ़िल्टर ऑब्जेक्ट को इनिशियलाइज़ करने और इसे सेवा में जोड़ने के लिए है। वेब कंटेनर एक बार init विधि को कॉल करके फ़िल्टर ऑब्जेक्ट को इनिशियलाइज़ करता है, और इसके बाद के अनुरोध doFilter() विधि के माध्यम से संसाधित किए जाते हैं।
- doFilter विधि
- यह विधि वेब कंटेनर द्वारा निष्पादित की जाती है जब भी url-पैटर्न से मेल खाने वाला कोई भी HTTP अनुरोध डिस्पैचर सर्वलेट को भेजा जाता है, और जब भी डिस्पैचर सर्वलेट क्लाइंट को HTTP प्रतिक्रिया भेजता है।
doFilter() का पैरामीटर FilterChain है, जो अगले लक्ष्य को अनुरोध भेजने के लिए FilterChain के doFilter() का उपयोग करता है। आप chain.doFilter() से पहले/बाद में अपनी आवश्यक प्रक्रियाएँ डालकर वांछित प्रक्रिया कर सकते हैं।
- यह विधि वेब कंटेनर द्वारा निष्पादित की जाती है जब भी url-पैटर्न से मेल खाने वाला कोई भी HTTP अनुरोध डिस्पैचर सर्वलेट को भेजा जाता है, और जब भी डिस्पैचर सर्वलेट क्लाइंट को HTTP प्रतिक्रिया भेजता है।
- destory विधि
- यह विधि फ़िल्टर ऑब्जेक्ट को सेवा से हटाने और उपयोग किए जा रहे संसाधनों को वापस करने के लिए है। यह वेब कंटेनर द्वारा एक बार बुलाया जाता है, और इसके बाद इसे अब doFilter() द्वारा संसाधित नहीं किया जाता है।
उदाहरण कोड - सर्वलेट स्पेक
```javascript @WebFilter("/*") public class dolphagoFilter implements Filter {
FilterChain filterChain) throws IOException, ServletException { // यहाँ पूर्व-प्रसंस्करण request.setCharacterEncoding("UTF-8"); System.out.println("doFilter() से पहले....");
}
उदाहरण कोड - @Component
```javascript @Order(1) @Component public class CustomFilter implements Filter {
}
- @Component: फ़िल्टर को स्प्रिंग बीन के रूप में पंजीकृत किया जा सकता है।
- @Order: यदि कई फ़िल्टर हैं, तो आप क्रम निर्धारित कर सकते हैं।
- सर्वलेट स्पेसिफिकेशन के अंतर्गत आने वाले फ़िल्टर को इस तरह से स्प्रिंग बीन के रूप में रजिस्टर करने पर, स्प्रिंग स्पेसिफिकेशन के अंतर्गत आने वाले अन्य बीन्स का उपयोग किया जा सकता है।
उदाहरण कोड - @Configuration
```javascript @Configuration public class CustomRegistrationBean {
}
यदि आप केवल विशिष्ट URI पर फ़िल्टर को सक्रिय करना चाहते हैं, तो आप फ़िल्टर को स्प्रिंग बीन के रूप में रजिस्टर करने के लिए FilterRegistrationBean का उपयोग कर सकते हैं।
फ़िल्टर (फ़िल्टर) का उपयोग
मुख्य रूप से अनुरोध पैरामीटर के सत्यापन और प्रसंस्करण के लिए जिम्मेदार है।
- सुरक्षा से संबंधित सामान्य कार्य
- चूँकि फ़िल्टर वेब कंटेनर में चलता है, इसलिए सुरक्षा जाँच (XSS, CSRF बचाव आदि) करके यह सुनिश्चित किया जा सकता है कि गलत अनुरोध अवरुद्ध हो जाएँ। चूँकि स्प्रिंग कंटेनर तक अनुरोध नहीं पहुँचता है और अवरुद्ध हो जाता है, इसलिए सुरक्षा में और वृद्धि की जा सकती है।
- सभी अनुरोधों के लिए लॉगिंग
- छवि/डेटा संपीड़न और स्ट्रिंग एन्कोडिंग
- फ़िल्टर वेब एप्लिकेशन में व्यापक रूप से उपयोग की जाने वाली सुविधाओं जैसे छवि या डेटा संपीड़न या स्ट्रिंग एन्कोडिंग को लागू करता है।
- ServletRequest कस्टमाइज़ेशन
- HttpServletRequest बॉडी की सामग्री को केवल एक बार पढ़ सकता है। इसलिए, फ़िल्टर या इंटरसेप्टर बॉडी को नहीं पढ़ सकते हैं। बॉडी को लॉग करने के लिए, आप एक कस्टम ServletRequest बना सकते हैं।
इंटरसेप्टर (इंटरसेप्टर)
इंटरसेप्टर (इंटरसेप्टर) क्या है?
इंटरसेप्टर (इंटरसेप्टर) J2EE मानक विनिर्देश फ़िल्टर (फ़िल्टर) के विपरीत स्प्रिंग द्वारा प्रदान की जाने वाली एक तकनीक है जो डिस्पैचर सर्वलेट को कंट्रोलर को कॉल करने से पहले और बाद में अनुरोध और प्रतिक्रिया को संदर्भित या संसाधित करने में सक्षम बनाती है। दूसरे शब्दों में, वेब कंटेनर में चलने वाले फ़िल्टर के विपरीत, इंटरसेप्टर स्प्रिंग कॉन्टेक्स्ट में चलता है।
डिस्पैचर सर्वलेट 핸들러 मै핑을 통해 적절한 컨트롤러를 찾도록 요청하는데, 그 결과로 실행 체인(HandlerExecutionChain)을 돌려준다. 그래서 이 실행 체인은 1개 이상의 인터셉터가 등록되어 있다면, 순차적으로 인터셉터를 거쳐 컨트롤러가 실행되도록 하고, 인터셉터가 없다면 바로 컨트롤러를 실행한다.
इंटरसेप्टर (इंटरसेप्टर) कार्यान्वयन
इंटरसेप्टर जोड़ने के लिए, आपको org.springframework.web.servlet.HandlerInterceptor इंटरफ़ेस को लागू करना होगा, जिसमें निम्नलिखित तीन विधियाँ हैं।
- preHandle विधि
- preHandle विधि कंट्रोलर को कॉल करने से पहले निष्पादित की जाती है। इसलिए, इसका उपयोग कंट्रोलर से पहले प्रसंस्करण किए जाने वाले पूर्व-प्रसंस्करण कार्यों या अनुरोध जानकारी को संसाधित या जोड़ने के लिए किया जा सकता है।
- preHandle विधि का तीसरा पैरामीटर, हैंडलर पैरामीटर, @RequestMapping से जुड़े विधि की जानकारी का एक सार है।
- preHandle विधि का रिटर्न टाइप बूलियन है, यदि रिटर्न वैल्यू सही है तो यह अगले चरण पर जाता है, लेकिन यदि यह गलत है तो यह कार्य रोक देता है, और बाद के कार्य (अगला इंटरसेप्टर या कंट्रोलर) निष्पादित नहीं होता है।
- postHandle विधि
- postHandle विधि कंट्रोलर को कॉल करने के बाद निष्पादित की जाती है। इसलिए, इसका उपयोग कंट्रोलर के बाद किए जाने वाले उत्तर-प्रसंस्करण कार्यों के लिए किया जा सकता है।
- afterCompletion विधि
- afterCompletion विधि, जैसा कि इसके नाम से पता चलता है, सभी कार्यों के पूरा होने के बाद निष्पादित की जाती है, जिसमें सभी दृश्यों द्वारा अंतिम परिणाम का उत्पादन शामिल है।
उदाहरण कोड
```javascript @Component public class CustomInterceptor implements HandlerInterceptor {
}
@Configuration public class WebMvcConfiguration implements WebMvcConfigurer {
}
- बनाए गए इंटरसेप्टर को बीन के रूप में रजिस्टर करें।
- WebMvcConfigurer इंटरफ़ेस की addInterceptors() विधि में बनाए गए इंटरसेप्टर को रजिस्टर करें।
- इंटरसेप्टर InterceptorRegistry में रजिस्टर किए गए क्रम में काम करते हैं।
इंटरसेप्टर (इंटरसेप्टर) का उपयोग
मुख्य रूप से सेवा तर्क का उपयोग करके अनुरोध जानकारी संगतता प्रसंस्करण के लिए जिम्मेदार है।
- प्रमाणीकरण/प्राधिकरण जैसे सामान्य कार्य
- प्राधिकरण और प्रमाणीकरण जैसे क्लाइंट अनुरोध से संबंधित कार्यों को कंट्रोलर में जाने से पहले जांचा जा सकता है।
- API कॉल के लिए लॉगिंग
- प्राप्त HttpServletRequest, HttpServletResponse ऑब्जेक्ट के माध्यम से क्लाइंट की जानकारी रिकॉर्ड की जा सकती है।
- कंट्रोलर को पारित डेटा का प्रसंस्करण
- प्राप्त HttpServletRequest, HttpServletResponse ऑब्जेक्ट को संसाधित करके कंट्रोलर को पास किया जा सकता है।
- AOP की नकल
- preHandle() विधि का तीसरा पैरामीटर, HandlerMethod, निष्पादित होने वाली विधि के हस्ताक्षर आदि के बारे में अतिरिक्त जानकारी प्रदान करता है, जिसका उपयोग निष्पादन तर्क का निर्धारण करने के लिए किया जा सकता है।
फ़िल्टर (फ़िल्टर) बनाम इंटरसेप्टर (इंटरसेप्टर)
- फ़िल्टर वेब कॉन्टेक्स्ट में चलता है, और इंटरसेप्टर स्प्रिंग कॉन्टेक्स्ट में चलता है, इसलिए निष्पादन समय अलग होता है।
- फ़िल्टर डिस्पैचर सर्वलेट से पहले और बाद में संभाल सकता है, जबकि इंटरसेप्टर कंट्रोलर से पहले और बाद में संभाल सकता है।
- फ़िल्टर का उपयोग स्प्रिंग से स्वतंत्र रूप से वैश्विक रूप से संसाधित होने वाले कार्यों को करने के लिए किया जा सकता है, या इनपुट पैरामीटर के सत्यापन के लिए, या जब HttpServletRequest के बजाय ServletRequest का उपयोग किया जाता है।
- इंटरसेप्टर का उपयोग क्लाइंट के अनुरोध से संबंधित वैश्विक रूप से संसाधित होने वाले कार्यों को करने के लिए किया जा सकता है, या जब सेवा तर्क को मिलाना होता है।
- इंटरसेप्टर @ControllerAdvice और @ExceptionHandler का उपयोग करके अपवादों को संभाल सकता है, जबकि फ़िल्टर अपवादों को संभालने के लिए इनका उपयोग नहीं कर सकता है।
- फ़िल्टर मुख्य रूप से try~catch क्लॉज में doFilter() विधि के आसपास लपेटकर उस समय उत्पन्न होने वाले अपवादों को सीधे संभालता है।
तर्क रिज़ॉल्वर
तर्क रिज़ॉल्वर क्या है?
तर्क रिज़ॉल्वर अनुरोध के कंट्रोलर में प्रवेश करने पर, अनुरोध में आए मानों से वांछित ऑब्जेक्ट को अप्रत्यक्ष रूप से बनाने में सहायक हो सकता है।
तर्क रिज़ॉल्वर का उपयोग
उदाहरण के लिए, मान लें कि एक अनुरोध JWT टोकन के साथ आया है। हमें यह सत्यापित करने की आवश्यकता है कि टोकन एक मान्य टोकन है, और फिर टोकन में संग्रहीत आईडी को निकालने और इसे लॉगिन उपयोगकर्ता ऑब्जेक्ट में बदलने की आवश्यकता है।
इस स्थिति में, यदि तर्क रिज़ॉल्वर का उपयोग नहीं किया जाता है, तो टोकन को सत्यापित करने और इसे लॉगिन उपयोगकर्ता ऑब्जेक्ट में बदलने की प्रक्रिया को प्रत्येक कंट्रोलर में लागू करना होगा। इससे उपयोगकर्ता सत्यापन की आवश्यकता वाले कंट्रोलर में डुप्लिकेट कोड उत्पन्न होगा और कंट्रोलर की ज़िम्मेदारी बढ़ जाएगी। तर्क रिज़ॉल्वर इस समस्या का समाधान कर सकता है।
तर्क रिज़ॉल्वर कार्यान्वयन
ArgumentResolver को HandlerMethodArgumentResolver को लागू करके उपयोग किया जा सकता है। और इस इंटरफ़ेस में निम्नलिखित दो विधियों को लागू करने की आवश्यकता है।
```javascript boolean supportsParameter(MethodParameter parameter);
@Nullable Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
- supportsParameter विधि
- ArgumentResolver द्वारा निष्पादित किए जाने वाले पैरामीटर के सामने एक विशिष्ट एनोटेशन बनाएँ और उसे संलग्न करें। supportsParameter() विधि अनुरोधित विधि के तर्क में वांछित एनोटेशन की उपस्थिति की जाँच करती है और यदि यह वांछित एनोटेशन शामिल करता है, तो यह सत्य देता है।
- resolveArgument विधि
- यदि supportsParameter सत्य देता है, अर्थात किसी विशिष्ट एनोटेशन के साथ कोई विधि है, तो यह वह विधि है जो पैरामीटर को वांछित प्रारूप में जानकारी बांधकर वापस करती है।
इस प्रकार ArgumentResolver का उपयोग करने पर कंट्रोलर का कार्यान्वयन इस प्रकार है।
```javascript
@GetMapping("/me")
public ResponseEntity
तर्क रिज़ॉल्वर और इंटरसेप्टर (इंटरसेप्टर) के बीच अंतर
- तर्क रिज़ॉल्वर इंटरसेप्टर के बाद काम करता है और जब कोई अनुरोध कंट्रोलर में प्रवेश करता है, तो अनुरोध में आए मानों से वांछित ऑब्जेक्ट देता है।
- दूसरी ओर, इंटरसेप्टर वास्तव में कंट्रोलर निष्पादित होने से पहले अनुरोध को रोकता है, और यह कोई विशिष्ट ऑब्जेक्ट नहीं दे सकता है। केवल बूलियन या शून्य रिटर्न प्रकार मौजूद हैं।
स्रोत
- https://mangkyu.tistory.com/173
- https://junhyunny.github.io/spring-boot/filter-interceptor-and-aop/
- https://supawer0728.github.io/2018/04/04/spring-filter-interceptor/
- https://tecoble.techcourse.co.kr/post/2021-05-24-spring-interceptor/
- https://baeldung-cn.com/spring-mvc-handlerinterceptor-vs-filter
- https://www.baeldung.com/spring-boot-add-filter
अपेक्षित साक्षात्कार प्रश्न और उत्तर
फ़िल्टर क्या है?
फ़िल्टर डिस्पैचर सर्वलेट को अनुरोध भेजे जाने से पहले/बाद में url पैटर्न से मेल खाने वाले सभी अनुरोधों के लिए अतिरिक्त कार्य संसाधित कर सकता है और सर्वलेट कंटेनर स्तर पर काम करता है।
फ़िल्टर का उपयोग कब किया जाता है?
फ़िल्टर का उपयोग स्प्रिंग से स्वतंत्र रूप से वैश्विक रूप से संसाधित होने वाले कार्यों को करने के लिए किया जा सकता है। या, अनुरोध पैरामीटर को सत्यापित करते समय इसका उपयोग किया जाता है।
सुरक्षा से संबंधित सामान्य कार्यों, सभी अनुरोधों के लिए लॉगिंग, छवि/डेटा संपीड़न और स्ट्रिंग एन्कोडिंग, ServletRequest कस्टमाइज़ेशन कार्यों को संसाधित करता है।
इंटरसेप्टर क्या है?
इंटरसेप्टर डिस्पैचर सर्वलेट को कंट्रोलर को कॉल करने से पहले और बाद में अनुरोध और प्रतिक्रिया को संदर्भित या संसाधित करने में सक्षम बनाता है, अर्थात यह स्प्रिंग कंटेनर स्तर पर काम करता है।
इंटरसेप्टर का उपयोग कब किया जाता है?
इंटरसेप्टर का उपयोग क्लाइंट के अनुरोध से संबंधित वैश्विक रूप से संसाधित होने वाले कार्यों को करने के लिए किया जा सकता है, और जब सत्यापन के दौरान सेवा तर्क को कॉल करना होता है, तो इसका उपयोग मुख्य रूप से किया जाता है।
प्राधिकरण/प्रमाणीकरण जैसे सामान्य कार्यों, API कॉल के लिए लॉगिंग, कंट्रोलर को पारित डेटा के प्रसंस्करण को संसाधित करता है।
फ़िल्टर और इंटरसेप्टर के बीच अंतर क्या है?
फ़िल्टर सर्वलेट कंटेनर स्तर पर चलता है, और इंटरसेप्टर स्प्रिंग कंटेनर स्तर पर चलता है।
फ़िल्टर डिस्पैचर सर्वलेट से पहले और बाद में संभाल सकता है, जबकि इंटरसेप्टर कंट्रोलर से पहले और बाद में संभाल सकता है।
इसलिए, फ़िल्टर का उपयोग स्प्रिंग से स्वतंत्र रूप से वैश्विक रूप से संसाधित होने वाले कार्यों को करने के लिए किया जाना चाहिए, जबकि इंटरसेप्टर का उपयोग क्लाइंट के अनुरोध से संबंधित वैश्विक रूप से संसाधित होने वाले कार्यों को करने के लिए किया जाना चाहिए।
तर्क रिज़ॉल्वर क्या है?
तर्क रिज़ॉल्वर अनुरोध के कंट्रोलर में प्रवेश करने पर, अनुरोध में आए मानों से वांछित ऑब्जेक्ट को अप्रत्यक्ष रूप से बनाने में सहायक हो सकता है।
तर्क रिज़ॉल्वर का उपयोग कब किया जाता है?
JWT टोकन के साथ अनुरोध आने पर, यह सत्यापित करने के लिए कि टोकन एक मान्य टोकन है, और फिर टोकन में संग्रहीत आईडी को निकालने के लिए और इसे LoginMember नामक ऑब्जेक्ट में बदलने के लिए इसका उपयोग किया जा सकता है।
इंटरसेप्टर और तर्क रिज़ॉल्वर के बीच अंतर क्या है?
तर्क रिज़ॉल्वर अनुरोध के कंट्रोलर में प्रवेश करने पर, अनुरोध में आए मानों से वांछित ऑब्जेक्ट देता है। दूसरी ओर, इंटरसेप्टर किसी ऑब्जेक्ट को नहीं दे सकता है, और इंटरसेप्टर निष्पादित होने के बाद तर्क रिज़ॉल्वर निष्पादित होता है।
टिप्पणियाँ0