2009-08-24 22 views
20

javax.servlet.Filter ऑब्जेक्ट प्रमाणीकरण के लिए दोनों का उपयोग किया जा सकता है (जहां फ़िल्टर को किसी भी सर्वलेट कार्य को करने से पहले अनुरोध को पकड़ने की आवश्यकता होती है) और एक्सएसएलटी अनुवाद के लिए (जहां सर्वलेट को पूरी तरह से सामग्री उत्पन्न करने की आवश्यकता होती है)। वास्तव में इसे कब निष्पादित किया जाता है?क्या Servlet के काम से पहले या उसके बाद निष्पादित किया गया है?

मुझे पता है कि यह कार्यान्वयन निर्भर है (वेब ​​कंटेनर पर), लेकिन ऐसा लगता है कि उन सभी को हल करने की आवश्यकता है।

शायद वेब कंटेनर के साथ प्रत्येक फ़िल्टर पंजीकरण के लिए कहीं कॉन्फ़िगरेशन विकल्प सेट किया गया है?

अतिरिक्त:

इसके अलावा, क्या फ़िल्टर निष्पादन के आदेश को नियंत्रित करता है? बारफिल्टर से पहले फूफिल्टर को क्यों निष्पादित किया जाएगा?

+0

फिल्टर निष्पादन के आदेश है web.xml फ़ाइल में प्रदान किया जा सकता फिल्टर मानचित्रण अनुक्रम के web.xml विन्यास के अनुसार किया जाता है -mapping>। कंटेनर प्रोग्राम के वर्कफ़्लो को शीर्ष डाउन से शुरू किए गए फ़िल्टर के साथ रोक देगा। –

उत्तर

43

संक्षेप में फ़िल्टर श्रृंखला सर्वलेट आमंत्रण को लपेटती है। श्रृंखला सभी लिंक को तब तक संसाधित करेगी जब तक कि यह "नीचे" हिट न हो जाए, फिर सर्वलेट को चलाने की अनुमति दें, और उसके बाद चेन को रिवर्स में वापस कर दें। उदाहरण के लिए, यदि आप एक नया "उदाहरण के फिल्टर" है, तो अपने doFilter() विधि कुछ ऐसा दिखाई देगा:

public void doFilter(ServletRequest request, 
     ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 
// do pre-servlet work here 
chain.doFilter(request, response); 
// do post servlet work here 

} 
+0

यह थोड़ा सा हो सकता है, लेकिन अगर मैं प्रतिक्रिया को अस्वीकार करना चाहता हूं तो क्या होगा? दूसरे शब्दों में, मैं वास्तव में प्रतिक्रिया को रोकना चाहता हूं? क्या यह एक ServletException फेंक दिया जा सकता है? –

+1

ServletException को फेंकना अभी भी क्लाइंट को "प्रतिक्रिया" वापस कर देगा, इसलिए यह प्रतिक्रिया वापस न लौटने पर आपके द्वारा उपयोग किए जाने वाले कार्यों पर निर्भर करेगा। आप एक नई प्रतिक्रिया ऑब्जेक्ट बना सकते हैं, केवल आपके द्वारा निर्दिष्ट सामग्री के साथ और यदि आपने चुना है तो उसे वापस कर दें। –

+0

आह अच्छा बिंदु। बिल्कुल कोई प्रतिक्रिया वास्तव में कभी वांछनीय नहीं है। यहां तक ​​कि जब doFilter() chain.doFilter() को कॉल करने से पहले लौटाता है, तब भी यह कुछ अन्य त्रुटि पृष्ठ या डिफ़ॉल्ट कुछ या अन्य देता है। –

0

@Rich: doFilter() से पहले या सर्वलेट का काम हो गया है के बाद मार डाला है?

एक फिल्टर एक प्रोग्राम है जो साथ सर्वलेट या JSP पेज जो यह जुड़ा हुआ है पहले सर्वर पर चलता है।

+0

में परिभाषा के क्रम द्वारा परिभाषित किया गया है, जहां से उद्धृत किया गया है? –

+0

मार्टी हॉल द्वारा "अधिक सर्वलेट्स और जावा सर्वर पेज" से उद्धृत किया गया है। –

+0

@adatapost क्योंकि यह आमंत्रण को लपेटता है, इसे सर्वलेट/जेएसपी से पहले बुलाया जाएगा, लेकिन प्रक्रियाओं के बाद नियंत्रण प्राप्त होगा (यदि कोई अन्य फ़िल्टर प्रोसेसिंग को बाधित नहीं करता है) –

7

alt text http://img228.imageshack.us/img228/8945/filter.png

आदेश के बारे में: के रूप में मैं कल्पना सर्वलेट कंटेनर से याद गारंटी नहीं है कि फिल्टर कुछ क्रम में बुलाया जाएगा।

+2

"फिल्टर मैपिंग दिखाई देने वाले क्रम में फ़िल्टर किए जाते हैं एक WAR की फ़िल्टर मैपिंग सूची में। आप एक्सएमएल के साथ सूची में कोडिंग कोडिंग डिस्क्रिप्टर में एक डब्ल्यूएआर के लिए फ़िल्टर मैपिंग सूची निर्दिष्ट करते हैं। "संदर्भ: http://docs.oracle.com/javaee/6/tutorial/doc /bnagb.html –

+3

आपकी छवि लिंक टूटा हुआ है। – Bob

-1

servlet2.3 विनिर्देश फिल्टर के अनुसार <फिल्टर का उपयोग कर Ref- http://www.programering.com/a/MTMyADOwATI.html

+0

जबकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (// meta.stackoverflow.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। –

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