2010-07-15 13 views
21

फ़िल्टर और इंटरसेप्टर के बीच वास्तव में क्या अंतर है? मुझे एहसास है कि एक क्रिया के पहले और बाद में इंटरसेप्टर आग लगती है, पुनरावर्ती रूप से, और फ़िल्टर को क्रियाओं और कुछ यूआरएल पैटर्न पर आग लगाने के लिए कॉन्फ़िगर किया जा सकता है। लेकिन आप कैसे जानते हैं कि प्रत्येक का उपयोग कब करें?स्ट्राट्स में फ़िल्टर बनाम इंटरसेप्टर 2

पुस्तक में मैं स्ट्रूट्स 2 पर पढ़ रहा हूं, ऐसा लगता है कि इंटरसेप्टर को धक्का दिया जा रहा है और मैंने यह सुनिश्चित करने के लिए प्रमाणीकरण इंटरसेप्टर लिखने के लिए एक ट्यूटोरियल का भी पालन किया है, हालांकि उपयोगकर्ता उपयोगकर्ता तक पहुंचने का प्रयास करता है एक यूआरएल जिसमें इसके साथ कोई कार्रवाई नहीं है, इंटरसेप्टर इसे पकड़ नहीं लेता है, जिसका मतलब है कि मुझे हर जेएसपी के साथ एक क्रिया को जोड़ना होगा जिसे मैं सुरक्षित रखना चाहता हूं। यह सही प्रतीत नहीं होता है।

मैं एक प्रमाणीकरण फ़िल्टर कर सकता हूं जो यूआरएल को संभालता है ताकि मुझे ऐसा करने की ज़रूरत न हो, लेकिन फिर, इंटरसेप्टरों का क्या मतलब है?

+10

/.bsp के/WEB-INF फ़ोल्डर में चिपकाना अच्छा अभ्यास है। इस तरह वे सीधे यूआरएल से अनुरोध नहीं किया जा सकता है। इसके बजाय उपयोगकर्ता को क्रियाओं के माध्यम से जाना चाहिए, जो कि सही जेएसपी (परिणाम के आधार पर) के लिए आगे बढ़ना चाहिए। – Pat

उत्तर

4

इंटरसेप्टर स्टैक हर अनुरोध पर आग लगती है।
फ़िल्टर केवल उन यूआरएल पर लागू होते हैं जिनके लिए उन्हें परिभाषित किया जाता है।

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

मुझे लगता है कि इंटरसेप्टर अधिक सामान्यतः प्रयोग किया उपकरण हैं ...

क्यों नहीं जुड़े कार्रवाई के साथ एक यूआरएल के लिए होता है?

+0

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

+0

कोई सही नहीं है, अगर कोई कार्रवाई करने के लिए कोई बिंदु नहीं है, तो एक को न डालें। हालांकि मुझे याद है कि एक क्रिया एक jsp पर रूट कर सकती है, बस एक स्ट्रिंग मान लौटा रही है। मुझे लगता है कि आप पाएंगे कि चीजों को करने के कई तरीके हैं, इसलिए तथ्य यह है कि कुछ ओवरलैप प्राकृतिक है। – hvgotcodes

+0

मुझे लगता है कि मैं सिर्फ सर्वोत्तम अभ्यास की तलाश में हूं, और कोई जवाब नहीं ढूंढ पाया है। विशेष रूप से अब सम्मेलन प्लगइन के साथ, यदि मेरे पास एक अपलोड फॉर्म है, तो मैं इसे "/ अपलोड-फॉर्म" टाइप करके एक क्रिया की तरह एक्सेस कर सकता हूं, मुझे सीधे jsp तक पहुंच भी नहीं है। समस्या यह है कि यह एक इंटरसेप्टर को ट्रिगर नहीं करता है, इसलिए फ़िल्टर केवल एक चीज है जो इसे पकड़ लेगा। – JPC

42

सबसे महत्वपूर्ण अंतर यह है कि "इंटरसेप्टर" स्ट्रूट 2 ढांचे का हिस्सा हैं, और स्ट्रैट्स 2 ढांचे द्वारा किए गए अनुरोध हैंडलिंग का केवल एक हिस्सा हैं। दूसरी ओर "फ़िल्टर" सर्वलेट विशिष्टता का एक हिस्सा हैं; दूसरे शब्दों में, वे सर्वलेट एपीआई का हिस्सा हैं। यदि आप स्ट्रूट्स 2 का उपयोग कर रहे हैं, तो आपको अपने स्ट्रूट्स 2 कार्यों के चारों ओर कार्यक्षमता लपेटने के लिए इंटरसेप्टर का उपयोग करना चाहिए। यदि आप अपने वेबएप पर आने वाले अनुरोधों के आसपास कार्यक्षमता को लपेटने की कोशिश कर रहे हैं, लेकिन स्ट्रूट 2 द्वारा प्रबंधित नहीं किया जा रहा है, तो एक फ़िल्टर अधिक उपयुक्त हो सकता है।

<filter> 
     <filter-name>struts2</filter-name> 
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
    </filter> 

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

इस फिल्टर, जो पकड़ने के लिए कॉन्फ़िगर किया गया है:

Btw, पूरे Struts 2 फ्रेमवर्क की तरह एक फिल्टर अपने वेब एप्लिकेशन, अपने वेब ऐप्लिकेशन की तैनाती वर्णनकर्ता (web.xml) में घोषित में विन्यस्त अंदर तैनात किया जाता है सभी अनुरोध यूआरएल पैटर्न, पूरे स्ट्रूट 2 ढांचे में प्रवेश बिंदु है।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

सर्वलेट स्पेक और स्ट्रूट 2 फ्रेमवर्क भेदभाव पर संकेत के लिए धन्यवाद। – asgs

+0

इसका मतलब है कि उनके पास समान कार्यक्षमता है। – hiway

+2

@hiway मैं नहीं कहूंगा कि उनके पास समान कार्यक्षमता है, मैं कहूंगा कि वे दो बहुत ही अलग संदर्भों में एक ही कार्यात्मक भूमिका निभाते हैं। – chad

4

इंटरसेप्टर क्या है?

स्ट्रूट्स 2 फ्रेमवर्क विभिन्न कार्यों द्वारा कुछ सामान्य चिंताओं के समाधान को साझा करने के लिए इंटरसेप्टर्स की अवधारणा का उपयोग करता है।

जैसा कि हम जानते हैं कि ढांचा इसके लिए अनुरोध के सबमिशन पर एक विशेष क्रिया वस्तु का आह्वान करता है। लेकिन कार्रवाई को निष्पादित करने से पहले, अतिरिक्त प्रसंस्करण की आवश्यकता के लिए किसी अन्य वस्तु द्वारा आमंत्रण को रोक दिया जाता है।

इसी तरह कार्रवाई के निष्पादन के बाद, आमंत्रण को फिर से अवरुद्ध किया जा सकता है। इस अवरोधक वस्तु को इंटरसेप्टर के रूप में जाना जाता है।

तो इंटरसेप्टर का उपयोग करने का उद्देश्य नियंत्रक परत पर अधिक नियंत्रण की अनुमति देना है और कुछ सामान्य तर्कों को अलग करना है जो कई क्रियाओं पर लागू होते हैं।

स्ट्रूट्स 2 ढांचे ने पहले ही इंटरसेप्टर्स का अपना सेट प्रदान कर लिया है जिसका उपयोग एक्शन क्लास निष्पादन से पहले और बाद में आवश्यक प्रसंस्करण प्रदान करने के लिए किया जा सकता है।

उनमें से एक "एलियास इंटरसेप्टर" है जिसे मैं यहां चर्चा करने जा रहा हूं।

उर्फ ​​इंटरसेप्टर:

उर्फ ​​इंटरसेप्टर कार्रवाई श्रृंखलन के मामले में किया जाता है। एक्शन चेनिंग का मतलब है कि एक एक्शन पहली क्रिया के सफल निष्पादन के बाद अन्य क्रियाओं को कॉल करता है।

यह इंटरसेप्टर एक अलग पैरामीटर नाम पर एक नामित पैरामीटर उपनाम करता है। क्रिया श्रृंखला में, जब दो अलग-अलग क्रिया वर्ग अलग-अलग नाम के साथ एक सामान्य पैरामीटर साझा करते हैं, तो इस इंटरसेप्टर का उपयोग पहले क्रिया वर्ग के एक पैरामीटर को उपनाम नाम देने के लिए किया जाता है, जो दूसरे क्रिया वर्ग में पैरामीटर नाम से मेल खाता है।

उर्फ ​​कार्रवाई की अभिव्यक्ति के रूप में होना चाहिए:

   #{ 'name1' : 'alias1' , 'name2' : 'alias2' } 
3

प्रति struts 2 जीवन चक्र/वास्तुकला के रूप में कोई इंटरसेप्टर फिल्टर से पहले क्रियान्वित कर रहे हैं। इसलिए यदि आपके अनुरोध के लिए कोई कार्रवाई मैपिंग नहीं है तो फ़िल्टर के माध्यम से गुजरने में यह असफल रहा है।

0

स्ट्रूट 2 फ्रेमवर्क सर्वलेट एपीआई पर निर्भर नहीं है। स्ट्रेट्स 2 क्रियाएं एक कंटेनर के साथ नहीं हैं। अक्सर सर्वलेट संदर्भों को सरल मानचित्र के रूप में दर्शाया जाता है, जिससे अलगाव में क्रियाओं का परीक्षण किया जा सकता है।

फ़िल्टर सर्वलेट एपीआई का एक हिस्सा है, इसलिए स्ट्रूट 2 फ्रेमवर्क इंटरफेसर्स की अवधारणा का उपयोग विभिन्न कार्यों से कुछ सामान्य चिंताओं के समाधान को साझा करने के लिए करता है।

इसके अलावा आप आसानी से इंटरसेप्टर और एक्शन क्लास के लिए टेस्ट केस लिख सकते हैं।

0

एक सामान्य नियम के

  • फिल्टर प्रत्येक request से पहले चलाए जा रहे हैं के रूप में। struts स्वयं एक फ़िल्टर है।
  • interceptors स्ट्रेट कार्यों के बाद, पहले चलाया जा सकता है। अगर अनुरोध .action के साथ समाप्त नहीं होता है तो वे नहीं चलेंगे।

तो, फिल्टर के कुछ उदाहरण हो सकता है:

  • आप अपने js और css फ़ाइलों को संपीड़ित करने के लिए चाहते हैं, तो आप नहीं फिल्टर इंटरसेप्टर के लिए जाना चाहिए।
  • यदि आप केवल कुछ आईपी पते को अपनी वेबसाइट तक पहुंचाना चाहते हैं तो आपको इसे फ़िल्टर के रूप में विकसित करना होगा और अनुरोध आईपी पता जांचना होगा।
  • यदि आप सीएसआरएफ हमले के खिलाफ अपनी साइट को सुरक्षित करना चाहते हैं तो आपको अनुरोधों पर सीएसआरएफ टोकन की जांच करने के लिए एक फ़िल्टर लिखना होगा।
  • आप प्रति अनुरोध समय अपनी साइट प्रतिक्रिया लॉग इन करना चाहते हैं, तो आप समय की गणना करने के लिए एक फिल्टर का उपयोग कर सकते से पहले और chain.doFilter(request, response)

सैद्धांतिक रूप से करने के बाद आप अपने खुद के interceptors के विकास और filters का उपयोग किए बिना एक struts वेब अनुप्रयोग विकसित कर सकते हैं केवल। लेकिन आपको बहुत सारी समस्याएं और कोड बॉयलर फ़िल्टर का सामना करना पड़ेगा।

कई स्ट्रैट्स 2 विशेषताएं इंटरसेप्टर के साथ बनाई गई हैं, आप इसे स्ट्रैट्स-डिफॉल्ट.एक्सएमएल (https://struts.apache.org/docs/struts-defaultxml.html) में पा सकते हैं, जब सूची इंटरसेप्टरों का उपयोग किया जा सकता है। (उदाहरण के ParametersInterceptor के लिए कार्रवाई से पहले चलाता कार्रवाई करने सबमिट किए प्रपत्र मूल्यों को लागू करने)

संदेश संसाधनों से आप आसानी से struts सुविधाओं तक पहुंच सकते इंटरसेप्टर के साथ काम करते हुए उदाहरण getText के लिए,,, वर्तमान कार्य का नाम और नाम स्थान प्राप्त कार्रवाई बदलने बहे।

यहाँ ऊपर ध्यान में रखते हुए कुछ मामले हैं जहां इंटरसेप्टर द्वारा विकसित किया जा सकता है:

  • आप चाहते हैं कि केवल उन कुछ कार्रवाई का उपयोग कर सकते में लॉग इन किया है, तो आप यह इंटरसेप्टर के साथ विकसित करना होगा।
  • यदि आप ट्रैक रखना चाहते हैं कि उपयोगकर्ता कौन सी कार्रवाइयां उपयोगकर्ता नेविगेशन है। आप विज़िट किए गए कार्यों का ट्रैक रखने के लिए एक इंटरसेप्टर का उपयोग कर सकते हैं।
  • आप एक बिंदु में अपनी कार्रवाई त्रुटियों को संभालने के लिए चाहते हैं, आप एक इंटरसेप्टर जो सभी invocation.invoke()

इंटरसेप्टर, struts कार्यों के लिए फिल्टर और उत्तरदायित्व डिज़ाइन पैटर्न की श्रृंखला प्रदान कर रहे हैं, जबकि फिल्टर पकड़ने का उपयोग कर सकते इस पैटर्न को अपने पूरे वेब एप्लिकेशन में प्रदान करें।

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