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

क्लासेस फिल्टर, फिल्टर चेन, फिल्टर कॉन्फिग
फ़िल्टर सर्वलेट के समान हैं, लेकिन कुछ छोटे अंतरों के साथ। अपना स्वयं का फ़िल्टर लिखने के लिए, आपको javax.servlet.Filter
.
फ़िल्टर में विधियाँ init()
और destroy()
. एक विधि के बजाय, service()
एक फ़िल्टर में एक doFilter()
. और यहां तक कि इसका अपना वर्ग FilterConfig भी है। फ़िल्टर को web.xml फ़ाइल में या @WebFilter एनोटेशन के माध्यम से सर्वलेट में भी जोड़ा जाता है।
तरीकों की सूची:
तरीकों | विवरण | |
---|---|---|
1 | init(FilterConfig config) |
फ़िल्टर आरंभीकरण |
2 | destroy() |
फ़िल्टर उतराई |
3 | doFilter(ServletRequest , ServletResponse, FilterChain) |
अनुरोध प्रसंस्करण (फ़िल्टरिंग) |
सर्वलेट और फ़िल्टर के बीच क्या अंतर है?
कई फिल्टर हो सकते हैं, और वे क्रमिक रूप से अनुरोध (और प्रतिक्रिया) को संसाधित करते हैं। उन्हें एक तथाकथित श्रृंखला में जोड़ा जाता है - और उनके लिए एक विशेष वर्ग भी है FilterChain
।
अनुरोध को विधि में संसाधित करने के बाद, आपको श्रृंखला में अगले फ़िल्टर की doFilter()
विधि को कॉल करने की आवश्यकता है । doFilter()
उदाहरण:
public class MyFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {
PrintWriter out = resp.getWriter();
out.print("Adding something before the body of the response");
chain.doFilter(req, resp); // call the next filter in the chain
out.print("Adding something after the body of the response");
}
public void destroy() {
}
}
वास्तव में, आप प्रतिक्रिया निकाय को उस तरह नहीं जोड़ सकते हैं । औपचारिक रूप से, फ़िल्टर और सर्वलेट एक दूसरे से स्वतंत्र होते हैं और इन्हें स्वतंत्र रूप से बदला जा सकता है। उन्हें अलग-अलग डेवलपर्स द्वारा अलग-अलग समय पर लिखा जा सकता है। फ़िल्टर फ़ंक्शन केवल एक सेवा फ़ंक्शन है, उदाहरण के लिए:
- आने वाले सभी अनुरोधों (और प्रतिक्रियाओं) को लॉग करना
- आधार - सामग्री संकोचन
- डेटा का एन्क्रिप्शन (और डिक्रिप्शन)।
- डेटा सत्यापन का अनुरोध करें
- वांछित शीर्षलेख जोड़ें/निकालें
- रीडायरेक्ट अनुरोध
- अभिगम नियंत्रण (जांच रहा है कि उपयोगकर्ता लॉग इन है या नहीं)
रिक्वेस्ट डिस्पैचर क्लास
कभी-कभी एक विधि के भीतर एक फ़िल्टर चल रहा है, जबकि doFilter()
एक और सर्वलेट को कॉल करना आवश्यक हो सकता है । ऐसा करने के लिए, कंटेनर में एक विशेष वस्तु होती है RequestDispatcher
।
आप इसे दो तरह से प्राप्त कर सकते हैं:
- वस्तु पर
HttpServletRequest
- वस्तु पर
ServletContext
इस ऑब्जेक्ट का उपयोग किसी मौजूदा अनुरोध को दूसरे सर्वलेट पर पुनर्निर्देशित करने के लिए किया जा सकता है । उदाहरण के लिए, यह पता चला कि उपयोगकर्ता अधिकृत नहीं है और हम उसे प्राधिकरण वाला एक पृष्ठ दिखाना चाहते हैं। ठीक है, या सर्वर पर कोई त्रुटि थी और हम उपयोगकर्ता को एक त्रुटि पृष्ठ प्रदर्शित करना चाहते हैं :)
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
String path = "/error.html";
ServletContext servletContext = this.getServletContext();
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
requestDispatcher.forward(request, response);
}
}
आप RequestDispatcher
फ़िल्टर से भी कॉल कर सकते हैं।
public class MyFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {
String path = "/error.html";
ServletContext servletContext = req.getServletContext();
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
requestDispatcher.forward(req, resp);
}
public void destroy() {
}
}
ध्यान दें कि अनुरोध विधि में संभाला जाएगा और उपयोग के बाद forward()
कॉल करने की कोई आवश्यकता नहीं है ।doFilter()
RequestDispatcher
रीडायरेक्ट और फॉरवर्ड की तुलना
और एक और महत्वपूर्ण बात। यदि आप उपयोगकर्ता को अपने सर्वलेट में किसी अन्य URI पर पुनर्निर्देशित करना चाहते हैं, तो आप इसे दो तरीकों से कर सकते हैं:
redirect
forward
हम पहले ही उनका विश्लेषण कर चुके हैं, लेकिन सुविधा के लिए मैं इसे फिर से कहूंगा।
जब आप कॉल के माध्यम से रीडायरेक्ट करते हैंresponse.sendRedirect("link")
, तो सर्वर ब्राउज़र (क्लाइंट) को एक प्रतिक्रिया 302
और आपके द्वारा निर्दिष्ट लिंक वापस भेजता है। और ब्राउज़र, सर्वर प्रतिक्रिया का विश्लेषण करने के बाद, आपके द्वारा पास किए गए लिंक को डाउनलोड करता है। यानी, ब्राउज़र में लिंक एक नए में बदल जाता है।
यदि आप कॉल के माध्यम से अग्रेषित करते हैंrequestDispatcher.forward()
, तो कंटेनर के अंदर एक नया अनुरोध किया जाता है, और आपका सर्वलेट आपके सर्वलेट की प्रतिक्रिया के रूप में ब्राउज़र (क्लाइंट) को अपनी प्रतिक्रिया भेजता है। इस मामले में, ब्राउजर को नए सर्वलेट से प्रतिक्रिया मिलती है, लेकिन ब्राउजर में लिंक नहीं बदलता है।
GO TO FULL VERSION