स्प्रिंग एमवीसी के डेलिगेटिंगफिल्टरप्रॉक्सी का क्या मतलब है?


120

मैं अपने स्प्रिंग एमवीसी ऐप में इसे देखता हूं web.xml:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

मैं यह पता लगाने की कोशिश कर रहा हूं कि ऐसा क्यों है और क्या इसकी वास्तव में जरूरत है।

मुझे यह स्पष्टीकरण स्प्रिंग डॉक्स में मिला लेकिन इससे मुझे इसका कोई मतलब नहीं है:

ऐसा लगता है कि यह घटक web.xmlस्प्रिंग में परिभाषित किए गए सर्वलेट्स और घटकों के बीच "गोंद" है applicationContext.xml

7.1.१ डेलीगेटिंगफिल्टरप्रॉक्सी

सर्वलेट फ़िल्टर का उपयोग करते समय, आपको स्पष्ट रूप से उन्हें अपने में घोषित करने की आवश्यकता होती है web.xml, या उन्हें सर्वलेट कंटेनर द्वारा अनदेखा किया जाएगा। स्प्रिंग सिक्योरिटी में, फ़िल्टर क्लास भी एप्लिकेशन के संदर्भ में परिभाषित स्प्रिंग बीन्स हैं और इस प्रकार स्प्रिंग की समृद्ध निर्भरता-इंजेक्शन सुविधाओं और जीवनचक्र इंटरफेस का लाभ उठाने में सक्षम हैं। वसंत DelegatingFilterProxyप्रदान करता है के बीच लिंक web.xmlऔर अनुप्रयोग संदर्भ।

DelegatingFilterProxy का उपयोग करते समय, आपको web.xmlफ़ाइल में कुछ इस तरह दिखाई देगा :

<filter>
   <filter-name>myFilter</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
   <filter-name>myFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

ध्यान दें कि फ़िल्टर वास्तव में एक है DelegatingFilterProxy, न कि वह वर्ग जो वास्तव में फ़िल्टर के तर्क को लागू करेगा। क्या DelegatingFilterProxyकरता है फ़िल्टर के तरीकों को एक बीन के माध्यम से सौंप दिया जाता है जो स्प्रिंग एप्लिकेशन संदर्भ से प्राप्त होता है। यह बीन को स्प्रिंग वेब एप्लिकेशन के संदर्भ जीवनचक्र समर्थन और कॉन्फ़िगरेशन लचीलेपन से लाभान्वित करने में सक्षम बनाता है। बीन को लागू करना होगा javax.servlet.Filterऔर इसका वही नाम होना चाहिए जो फ़िल्टर-नाम तत्व में है। अधिक जानकारी के लिए प्रतिनिधि प्रतिनिधि के लिए Javadoc पढ़ें

तो, अगर मैं इसे अपने से बाहर निकालता हूं web.xml, तो क्या होगा? मेरे सर्वलेट स्प्रिंग कंटेनर के साथ संवाद करने में सक्षम नहीं होंगे? **

जवाबों:


127

यहां कुछ प्रकार का जादू है, लेकिन अंत में, सब कुछ एक नियतात्मक कार्यक्रम है।

DelegatingFilterProxy एक फिल्टर के रूप में यह ऊपर बताया गया था, जिसका लक्ष्य "है एक स्प्रिंग से प्रबंधित सेम कि लागू फ़िल्टर इंटरफेस को सौंपने , यह है कि, यह आपके स्प्रिंग आवेदन पत्र में एक सेम (" लक्ष्य सेम "या" प्रतिनिधि ") पाता है" संदर्भ और यह आह्वान करता है। यह कैसे संभव है? क्योंकि यह बीन javax.servlet.Filter को लागू करता है, इसकी doFilter विधि को कहा जाता है।

किस बीन को कहा जाता है? DelegatingFilterProxy "स्प्रिंग एप्लिकेशन के संदर्भ में लक्ष्य बीन के नाम को निर्दिष्ट करते हुए" लक्ष्यनाम "[...] का समर्थन करता है।"

जैसा कि आपने अपने web.xml में देखा कि बीन का नाम " स्प्रिंगसैक्विटीफिल्टरचिन " है

तो, एक वेब एप्लिकेशन के संदर्भ में, एक फ़िल्टर आपके आवेदन के संदर्भ में "स्प्रिंगसैक्विटीफिल्टरचिन" नामक बीन को तुरंत तैयार करता है और फिर उसे डेलीलेटर () विधि के माध्यम से सौंपता है।

याद रखें, आपका एप्लिकेशन संदर्भ सभी एप्लिकेशन-नियंत्रण (XML) फ़ाइलों के साथ परिभाषित किया गया है। उदाहरण के लिए: applicationContext.xml और applicationContext-security.xml।

तो बाद में "स्प्रिंगसैक्विटीफिल्टरचिन" नामक बीन खोजने की कोशिश करें ...

... और शायद आप नहीं कर सकते हैं (उदाहरण के लिए यदि आपने एक ट्यूटोरियल का अनुसरण किया है या यदि आपने रूओ का उपयोग करके सुरक्षा को कॉन्फ़िगर किया है)

यहां जादू है: सुरक्षा को कॉन्फ़िगर करने के लिए एक नया तत्व है , कुछ ऐसा है

<http auto-config="true" use-expressions="true"> 

जैसा कि http://www.springframework.org/schema/security/spring-security-3.0.xsd द्वारा अनुमति दी गई है, चाल चलेगी।

जब स्प्रिंग एक्सएमएल फ़ाइलों का उपयोग करके एप्लिकेशन के संदर्भ को लोड करता है, यदि यह एक तत्व पाता है, तो यह HTTP सुरक्षा, अर्थात् एक फिल्टर स्टैक और संरक्षित URL को सेट करने और "SpringSecurityFilterChain" नामक FilterChainProxy को पंजीकृत करने का प्रयास करेगा।

वैकल्पिक रूप से, आप बीन को क्लासिक तरीके से परिभाषित कर सकते हैं, जो है:

<beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">

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


"applicationContext-security.xml और applicationContext-security.xml" दो बार एक ही फ़ाइल नाम है।
मुस्किक

धन्यवाद musiKk (मुझे लगता है कि आप पोस्ट को सीधे संपादित कर सकते हैं)
jbbarquero

यह स्पष्टीकरण था कि मैं सब कुछ देख रहा था और मेरे लिए चीजें साफ कर दी थी।
user871611

@jbbarquero: आप सही हैं लेकिन मुझे यकीन नहीं था कि सही संस्करण क्या होना चाहिए। मैं मूल लेखक को ठीक करने के लिए छोड़ देता हूं ताकि अनजाने में अर्थ न बदले।
मुस्कीक

ठीक है। किसी भी मामले में, मैं अपनी प्रतिक्रिया में सुधार करने के लिए आपकी मदद की बहुत सराहना करता हूं। धन्यवाद फिर से, musiKk
jbbarquero

73

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

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

यदि आप उस फ़िल्टर मैपिंग को अपने web.xml से बाहर निकालते हैं, तो सब कुछ काम करता रहेगा, लेकिन आपका कोई भी URL सुरक्षित नहीं होगा। (यह मानकर चल रहा है कि "springSecurityFilterChain" नाम सटीक रूप से यह बताता है कि यह क्या करता है।) ऐसा इसलिए है क्योंकि यह मानचित्रण प्रत्येक आने वाले अनुरोध को फ़िल्टर कर रहा है और इसे एक सुरक्षा फ़िल्टर को सौंप रहा है जो आपके स्प्रिंग संदर्भ में परिभाषित है।


इस रोशन टिप्पणी को पोस्ट करने के लिए धन्यवाद। मैं अब स्प्रिंग सिक्योरिटी सीख रहा हूं, यह अनुकूलन करने के लिए पर्याप्त समझने की कोशिश कर रहा हूं। मुझे पता नहीं था कि सर्वलेट फ़िल्टर क्या थे या स्प्रिंग्स फ़िल्टर क्या हैं। AOP के बारे में आपकी बिट यह स्पष्ट करती है कि किसी ने केवल सर्वलेट्स का उपयोग करने के बजाय फ़िल्टर क्यों किया होगा ........ इसलिए आपको प्रत्येक सर्वलेट / संसाधन में एक ही प्री / पोस्ट प्रोसेसिंग को बार-बार नहीं लिखना होगा
स्टीव

वाह। वह स्पष्टीकरण ठीक वही है जिसकी मुझे आवश्यकता थी। अपना ज्ञान साझा करने के लिए आपका धन्यवाद।
चार्ल्स मोरिन

@ रेयान स्टीवर्ट अगर मेरे पास दो बीन्स के औजार हैं, तो एप्लिकेशन कॉन्टेक्स्ट में फ़िल्टर इंटरफेस है, और मैं एक ऑर्डर में निष्पादित करना चाहता हूं, फिर मैं इसे कैसे बना सकता हूं?
अभिषेक नायक

@ सफ़्फ़मैन अगर मेरे पास दो बीन्स के औजार हैं, तो एप्लिकेशनकंटेक्स्ट में फ़िल्टर इंटरफेस है, और मैं एक ऑर्डर में निष्पादित करना चाहता हूं, फिर मैं इसे कैसे बना सकता हूं?
अभिषेक नायक

44

सर्वलेट फिल्टर क्या हैं?

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

ये फ़िल्टर लक्ष्य सर्वलेट तक पहुँचने से पहले अनुरोधों को रोक सकते हैं। आप सर्वलेट फिल्टर में प्राधिकरण की तरह, सामान्य कार्यक्षमता को लागू कर सकते हैं। एक बार लागू होने के बाद, आप अपने वेब में फ़िल्टर को कॉन्फ़िगर कर सकते हैं। एक विशिष्ट सर्वलेट, विशिष्ट अनुरोध url पैटर्न या सभी url पैटर्न पर लागू होने के लिए।

सर्वलेट फ़िल्टर कहां उपयोग किए जाते हैं?

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

इंस्टेंटेटिंग सर्वलेट फिल्टर - स्प्रिंग फ्रेमवर्क के बिना

आपका सर्वलेट कंटेनर घोषित किए गए फ़िल्टरों के उदाहरण बनाता है web.xmlऔर उन्हें उचित समय पर कॉल करता है (यानी, जब सर्विसिंग अनुरोधों को सेवित करता है)। अब अगर आप अधिकांश डिपेंडेंसी इंजेक्शन (DI) के प्रशंसकों की तरह हैं, तो आप यह कहेंगे कि उदाहरणों का निर्माण मेरी DI की रूपरेखा (स्प्रिंग) बेहतर करती है। क्या मुझे स्प्रिंग के साथ अपने सर्वलेट फ़िल्टर नहीं मिल सकते हैं, इसलिए वे सभी DI अच्छाई के लिए उत्तरदायी हैं?

DelegatingFilterProxy, ताकि स्प्रिंग आपके फ़िल्टर इंस्टेंसेस बनाए

यह वह जगह है जहां DelegatingFilterProxyचरणों में, स्प्रिंग फ्रेमवर्क द्वारा प्रदान किए गए इंटरफ़ेस DelegatingFilterProxyका एक अव्यवस्था है javax.servlet.Filter। एक बार जब आप DelegatingFilterProxyweb.xml में कॉन्फ़िगर कर लेते हैं, तो आप वास्तविक बीन्स को घोषित कर सकते हैं जो आपके स्प्रिंग कॉन्फ़िगरेशन में फ़िल्टरिंग करते हैं। इस तरह, स्प्रिंग उन बीन्स के उदाहरणों को बनाता है जो वास्तविक फ़िल्टरिंग करते हैं, और आप इन बीन्स को कॉन्फ़िगर करने के लिए DI का उपयोग कर सकते हैं।

ध्यान दें कि आपको केवल एक ही DelegatingFilterProxyघोषणा की आवश्यकता है , web.xmlलेकिन beanआपके आवेदन के संदर्भ में कई फ़िल्टरिंग एक साथ जंजीर में हो सकते हैं।


बहुत अच्छी तरह से समझाया।
user4906240

15

बात यह है, सर्वलेट फिल्टर सर्वलेट कंटेनर द्वारा प्रबंधित किए जाते हैं, और वसंत द्वारा नहीं। और आपको अपने फिल्टर में कुछ वसंत घटकों को इंजेक्ट करने की आवश्यकता हो सकती है।

तो, अगर आपको कुछ चाहिए:

public class FooFilter {

    @Inject
    private FooService service;

    public void doFilter(....) { .. }

}

फिर आपको डेलिगेटिंग फिल्टर प्रॉक्सी की जरूरत है।


1

आप 'गोंद' सामान के बारे में सही हैं। फ़िल्टरचैनप्रॉक्सी के JavaDocs में लिखा गया है :

FilterChainProxy अनुप्रयोग web.xml फ़ाइल में एक मानक स्प्रिंग डेलिगेटिंगफिल्टरप्रॉक्सी घोषणा जोड़कर सर्वलेट कंटेनर फ़िल्टर श्रृंखला में जुड़ा हुआ है।

कृपया एक उत्कृष्ट स्पष्टीकरण के लिए ब्लॉग के वसंत सुरक्षा नाम के पीछे FIlterChainProxy अनुभाग देखें ।


0

मुझे web.xml में "springSecurityFilterChain" द्वारा हैरान कर दिया गया है और स्प्रिंगफ़्रामवर्क सुरक्षा दस्तावेज़ में यह उत्तर मिला है:

<http>तत्व अपने आवेदन की वेब परत के लिए सुरक्षा विन्यास समाहित। > यह एक फ़िल्टरचैनप्रॉक्सी बीन बनाता है, जिसका नाम "springSecurityFilterChain" है, जो> सुरक्षा फ़िल्टर का ढेर बनाए रखता है जो वेब सुरक्षा कॉन्फ़िगरेशन [19] का निर्माण करता है। कुछ कोर फ़िल्टर हमेशा> बनाए जाते हैं और अन्य को स्टैक में जोड़ा जाएगा जो कि विशेषता वाले बाल तत्वों के आधार पर> मौजूद हैं। मानक फ़िल्टर की स्थितियाँ निर्धारित की जाती हैं (फ्रेमवर्क के प्रथम संस्करण में फ़िल्टर ऑर्डर तालिका देखें), फ्रेमवर्क के पिछले संस्करणों के साथ त्रुटियों का एक सामान्य स्रोत हटाते हुए> जब उपयोगकर्ताओं को फ़िल्टर श्रृंखला को स्पष्ट रूप से फ़िल्टरचैनेप्रॉक्सीन में कॉन्फ़िगर करना पड़ा। यदि आप कॉन्फ़िगरेशन के पूर्ण नियंत्रण की आवश्यकता है, तो आप निश्चित रूप से, यह कर सकते हैं।

यहाँ लिंक http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html


0

यह एक लंबा समय रहा है लेकिन मेरे पास एक ही सवाल था और मुझे यह मिला: https://www.javacodegeeks.com/2013/11/spring-security-behind-the-scenes.html

मैंने सवाल में फिल्टर को हटाकर और इसे जोड़कर अपनी वसंत सुरक्षा परियोजना चलाने की कोशिश की। मैंने जो पाया है यदि हम फ़िल्टर जोड़ते हैं, तो केवल कॉल वसंत-सुरक्षा कॉन्फ़िगरेशन में परिभाषित आवश्यक लॉगिन पृष्ठ पर रीडायरेक्ट करेगा।

इसलिए, @ रयान के जवाब से सहमत।

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