फिल्टरचा परिचय

पण एवढेच नाही. तुम्हाला असे वाटत नाही की सर्व्हलेट्स इतके सोपे आहेत, नाही का?

आम्ही आधीच विश्लेषण केलेल्या सर्व्हलेट्स व्यतिरिक्त, तथाकथित "युटिलिटी सर्व्हलेट्स" - फिल्टर्स देखील आहेत . ते सर्व्हलेट्ससारखेच आहेत, परंतु त्यांचे मुख्य कार्य म्हणजे सर्व्हलेट्सना विनंती प्रक्रिया करण्यात मदत करणे.

फिल्टर हा सेक्रेटरीसारखा असतो आणि सर्व्हलेट हा डायरेक्टरसारखा असतो. दस्तऐवज संचालकांच्या डेस्कवर पोहोचण्यापूर्वी, ते सचिवांच्या हातातून जाईल. आणि दिग्दर्शकाने त्यावर स्वाक्षरी केल्यानंतर, ते पुन्हा सेक्रेटरीकडे जाईल, उदाहरणार्थ, आउटगोइंग पत्रव्यवहार म्हणून.

असा सेक्रेटरी दिग्दर्शकाच्या काही विनंत्या नाकारू शकतो (उदाहरणार्थ, स्पॅम). किंवा त्याला माहित असलेल्या प्रश्नांची मानक उत्तरे द्या ("दिग्दर्शक जागेवर नाही"). वगैरे. शिवाय, असे अनेक सचिव असू शकतात: एक एकाच वेळी सर्व संचालकांसाठी स्पॅम फिल्टर करू शकतो, दुसरा वेगवेगळ्या संचालकांमधील विनंत्या हस्तांतरित करू शकतो आणि यासारख्या.

फिल्टर त्याच प्रकारे कार्य करतात.

युटिलिटी सर्व्हलेट्स"

वर्ग फिल्टर, फिल्टरचेन, फिल्टरकॉन्फिग

फिल्टर हे सर्वलेटसारखेच असतात, परंतु काही लहान फरकांसह. तुमचे स्वतःचे फिल्टर लिहिण्यासाठी, तुम्हाला कडून वारसा मिळणे आवश्यक आहे javax.servlet.Filter.

फिल्टरमध्ये पद्धती देखील आहेत init()आणि destroy(). पद्धतीऐवजी, service()फिल्टरमध्ये एक आहे doFilter(). आणि त्याचे स्वतःचे वर्ग FilterConfig देखील आहे. फिल्टर वेब.xml फाइलमध्ये किंवा @WebFilter भाष्याद्वारे सर्व्हलेटमध्ये देखील जोडले जाते.

पद्धतींची यादी:

पद्धती वर्णन
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() , कंटेनरमध्ये एक नवीन विनंती केली जाते आणि तुमचा सर्व्हलेट त्याचा प्रतिसाद ब्राउझरला (क्लायंट) तुमच्या सर्व्हलेटचा प्रतिसाद म्हणून पाठवते. या प्रकरणात, ब्राउझरला नवीन सर्व्हलेटकडून प्रतिसाद प्राप्त होतो, परंतु ब्राउझरमधील दुवा बदलत नाही.