1. مقدمة للفلتر
يسمى المرشح أيضًا مرشحًا. إنها التكنولوجيا الأكثر إثارة في تقنية Servlet. من خلال تقنية التصفية ، يعترض مطورو الويب جميع موارد الويب التي تديرها خوادم الويب: مثل JSP أو Servlet أو ملفات الصور الثابتة أو ملفات HTML الثابتة ، وبالتالي تحقيق بعض الوظائف الخاصة. على سبيل المثال ، قم بتنفيذ بعض الوظائف المتقدمة مثل التحكم في الوصول إلى أذونات عنوان URL ، وتصفية المفردات الحساسة ، وضغط معلومات الاستجابة.
يوفر واجهة برمجة تطبيقات Servlet واجهة مرشح. عند تطوير تطبيقات الويب ، إذا قامت فئة Java المكتوبة بتنفيذ هذه الواجهة ، فإن فئة Java تسمى مرشح المرشح. من خلال تقنية المرشح ، يمكن للمطورين تطبيق طلبات وصول المستخدمين واستجاباتها قبل الوصول إلى مورد مستهدف ، كما هو موضح أدناه:
2. كيف يعترض المرشح؟
هناك طريقة dofilter في واجهة المرشح. عندما نكتب مرشحًا وتكوين مورد الويب الذي يجب اعتراضه ، سيقوم خادم الويب باستدعاء طريقة DoFilter للمرشح في كل مرة قبل استدعاء طريقة الخدمة لمورد الويب. لذلك ، يمكن للكتابة في هذه الطريقة تحقيق الغرض التالي:
1. دع جزءًا من الكود ينفذ قبل استدعاء المورد الهدف.
2. ما إذا كان يجب استدعاء المورد المستهدف (أي ، سواء للسماح للمستخدمين بالوصول إلى مورد الويب).
3. بعد استدعاء المورد المستهدف ، دع جزءًا من الرمز ينفذ.
عندما يستدعي خادم الويب طريقة DoFilter ، فإنه سيمرر كائن FilterChain. كائن FilterChain هو الكائن الأكثر أهمية في واجهة التصفية. كما يوفر طريقة dofilter. يمكن للمطورين أن يقرروا ما إذا كان يجب استدعاء هذه الطريقة وفقًا لاحتياجاتهم. إذا تم استدعاء هذه الطريقة ، فسيقوم خادم الويب بالاتصال بأسلوب الخدمة لمورد الويب ، أي أنه سيتم الوصول إلى مورد الويب ، وإلا فلن يتم الوصول إلى مورد الويب.
3. البدء في تطوير المرشح
3.1. تصفية خطوات تطوير
ينقسم تطوير المرشح إلى خطوتين:
1. اكتب فئة Java لتنفيذ واجهة المرشح وتنفيذ طريقة Dofilter الخاصة بها.
2. استخدم عناصر <Filter> و <filter-Mapping> في ملف web.xml لتسجيل فئة التصفية المكتوبة وتعيين الموارد التي يمكن أن يعترضها.
مثال مرشح:
package me.gacl.web.filter ؛ import java.io.ioException ؛ import javax.servlet.filter ؛ import javax.servlet.filterchain ؛ import javax.servlet.filterconfig ؛ eSport javax.servlet.servlexception ؛ import javax.servlet.servleest. javax.servlet.servletresponse ؛/*** className: filterdemo*description: ثلاثة تطبيقات نموذجية للمرشح:*، يمكنك أن تقرر ما إذا كنت ستستدعي السلسلة. تم تنفيذها ، يمكن التقاط نتيجة تنفيذ المورد المستهدف ، وبالتالي إدراك بعض الوظائف الخاصة* Author: 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小 � استجابة ، سلسلة مرشحات المرشحات) يلقي IOException ، ServleTexception {// يرجى بعض المعالجة المسبقة عند الطلب والاستجابة request.setcharacterencoding ("utf-") ؛ reponse.setcharacterencoding ("utf-") ؛ review.setContentType ("text/html ؛ charset = utf-") ؛ system.out.println ("filterdemo قبل التنفيذ !!! // دع المورد المستهدف ينفذ نظامه وإصداره. تكوين المرشحات في web.xml:
<؟ xml الإصدار = "." الترميز = "UTF-"؟> <إصدار web-app = "." xmlns = "http://java.sun.com/xml/ns/javaee" http://java.sun.com/xml/ns/javaee/web-app__.xsd "> <display-name> </isplay-name> <welcome-file-list> <حب Filter-> <iliter> <filter-name> filterDemo </filter-name> <filter-class> me.gacl.web.filter.filterdemo </filter-class> </filter> <!-Mapping filter-> <filter-mapping> <filter-name> filterdemo </ilit الطلبات-> <url-pattern>/*</url-pattern> </filter-mapping> </bil-app>
3.2. سلسلة مرشح
في تطبيق الويب ، يمكن تطوير مرشحات متعددة وكتابتها ، والتي يتم دمجها في سلسلة مرشح واحدة.
يقرر خادم الويب المرشح الذي يجب الاتصال به أولاً وفقًا للترتيب الذي يتم فيه تسجيل التصفية في ملف web.xml. عند استدعاء طريقة Dofilter للمرشح الأول ، سيقوم خادم الويب بإنشاء كائن FilterChain الذي يمثل سلسلة المرشح ونقله إلى الطريقة. في طريقة Dofilter ، إذا قام المطور باستدعاء طريقة dofilter لكائن FilterChain ، فسيتحقق خادم الويب ما إذا كان لا يزال هناك مرشح في كائن FilterChain. إذا كان هناك ، يتم استدعاء المرشح الثاني ، وإذا لم يكن هناك ، فسيتم استدعاء المورد المستهدف.
4. دورة حياة المرشح
4.1. إنشاء مرشح
إن إنشاء وتدمير المرشح هو مسؤولية خادم الويب. عند بدء تشغيل تطبيق الويب ، سيقوم خادم الويب بإنشاء كائن مثيل للمرشح واتصل طريقة init الخاصة به لإكمال وظيفة التهيئة للكائن ، وبالتالي التحضير لاعتراض طلبات المستخدم اللاحقة. سيتم إنشاء كائن المرشح مرة واحدة فقط ، وسيتم تنفيذ طريقة init مرة واحدة فقط. من خلال معلمات طريقة init ، يمكن الحصول على كائن FilterConfig الذي يمثل معلومات تكوين المرشح الحالية.
4.2. تدمير المرشح
تدعو حاوية الويب طريقة التدمير لتدمير المرشح. يتم تنفيذ طريقة التدمير مرة واحدة فقط خلال دورة حياة المرشح. في طريقة التدمير ، يمكن تحرير الموارد التي يستخدمها المرشح.
4.3. FilterConfig واجهة
عند تكوين المرشحات ، يمكن للمستخدمين استخدام <Ing-param> لتكوين بعض معلمات التهيئة للمرشحات. عندما تقوم حاوية الويب بتسوية كائن المرشح وتستدعي طريقة init الخاصة بها ، سيتم تمرير كائن FilterConfig الذي يتضمن معلمات تهيئة المرشح. لذلك ، عندما يكتب المطورون مرشحات ، يمكنهم الحصول على:
سلسلة getFiLtername (): احصل على اسم المرشح.
سلسلة getInitParameter (اسم السلسلة): إرجاع قيمة معلمة التهيئة مع الاسم المحدد في وصف النشر. إرجاع فارغة إذا لم يكن موجودًا.
التعداد getInitParameterNames (): إرجاع مجموعة التعداد من أسماء جميع معلمات التهيئة للمرشح.
Public ServletContext getServletContext (): إرجاع إشارة إلى كائن سياق servlet.
مثال: استخدم FilterConfig للحصول على معلومات تكوين المرشح
package me.gacl.web.filter ؛ استيراد java.io.ioException ؛ استيراد java.util.enumeration ؛ استيراد javax.servlet.filter ؛ import javax.servlet.filterchain ؛ import javax.servlet.filterConfig ؛ import javax.servlet.servlexception ؛ javax.servlet.servletresponse ؛ فئة الفئة العامة filterdemo تنفذ filter {/* filter تهيئة* see javax.servlet.filter#init (javax.servlet.filterConfig)*/ @overrideperip void init (filterConfig filterConfig) التهيئة ---- ") ؛/*** <Filter> <filter-name> filterdemo </filter-name> <ilter-class> me.gacl.web.filter.filterdemo </filter-class> <!-تكوين معلمات التهيئة لفلتر ديلتر-> تصفية </description> <param-name> الاسم </param-name> <param-value> gacl </parm-value> </ith-param> <Ing-p aram> <spried> تكوين معلمات التهيئة لـ FilterDemo مرشح </description> <Param-name> مثل </param-name> <Param-value> java </parm-value> </ith-param> </filter> <filter-mapping> <filter-name> filterDemo </filter-name> <!-"/*" يعني مقابلة جميع الطلبات-<Url-pirotn> اسم FILTER'S FILTERNAME = FILTERCONFIG.GETFILTERNAME () ؛ // احصل على معلمة التهيئة التي تم تكوينها في سلسلة ملف web.xml initParam = filterConfig.getInitParameter ("name") ؛ String initParam = filterConfig.getInitParameter ("مثل") ؛ // إرجاع مجموعة تعداد من أسماء جميع معلمات التهيئة للمرشح. التعداد <string> initParameterNames = filterConfig.getInitParameterNames () ؛ system.out.println (filtername) ؛ system.out.println (initparam) ؛ system.out.println (initparam) ؛ system.out.println (initparam) ؛ بينما (initparameTernames.hasmoreElements ()) {String paramName = (string) initParameterNames.nextElement () ؛ system.out.println (paramName) ؛ {system.out.println ("filterdemo قبل التنفيذ !!!") ؛ Chain.dofilter (طلب ، استجابة) ؛ // دعنا يتم تنفيذ المورد المستهدف ونظام. 5. مرشح نشر
ينقسم نشر المرشح إلى خطوتين:
1. تسجيل مرشح
2. مرشح رسم الخرائط
5.1. تسجيل مرشح
بعد تطوير Filter ، تحتاج إلى التسجيل في ملف web.xml بحيث يمكن استدعاؤك بواسطة خادم الويب.
سجل مرشح مثال في ملف web.xml:
<FivilT> <specord> filterdemo filter </specivery> <filter-name> filterDemo </filter-name> <filter-class> me.gacl.web.filter.filterdemo </filter-class> <!-تكوين معلمات التهيئة لفلتر dilter- RIPT> <Param-Name> name </param-name> <param-value> gacl </parm-value> </IPAR-PARAM> <IRIN
<sports> يستخدم لإضافة معلومات الوصف. يمكن أن يكون محتوى هذا العنصر فارغًا ولا يمكن تكوين <Description>.
يتم استخدام <filter-name> لتحديد اسم المرشح ، ولا يمكن أن يكون محتوى العنصر فارغًا.
يتم استخدام عنصر <filter-class> لتحديد اسم الفئة المؤهلة الكامل للمرشح.
يتم استخدام عنصر <Ing-param> لتحديد معلمات التهيئة للمرشح ، ويحدد عنصر الطفل <param-name> اسم المعلمة و <param-value> قيمة المعلمة. في المرشح ، يمكن الوصول إلى معلمات التهيئة باستخدام كائن واجهة FilterConfig. إذا كان المرشح لا يحتاج إلى تحديد معلمات التهيئة ، فقد لا يتم تكوين عنصر <Ing-param>.
5.2. مرشح رسم الخرائط
بعد تسجيل التصفية في ملف web.xml ، يجب عليك أيضًا تعيين مرشح في ملف web.xml
<!-مرشح رسم الخرائط-> <filter-mapping> <filter-name> filterDemo </filter-name> <!-"/*" يعني اعتراض جميع الطلبات-> <url-pattern>/*</url-pattern> </filed-mapping>
يتم استخدام عنصر <filter-Mapping> لتعيين المورد الذي يكون المرشح مسؤولاً عن الاعتراض. يمكن تحديد مرشح مورد يمكن تحديده بطريقتين: اسم servlet ومسار الطلب للوصول إلى الموارد.
يتم استخدام عنصر الطفل <filter-name> لتعيين اسم تسجيل المرشح. يجب أن تكون هذه القيمة هي اسم المرشح المعلن في عنصر <Url-pattern>. اضبط مسار الطلب الذي تم اعتراضه بواسطة المرشح (نمط عنوان URL المرتبط بالمرشح)
<Sradlet-Name> يحدد اسم Servlet الذي تم اعتراضه بواسطة المرشح.
يحدد <Sidatcher> الطريقة التي يطلق عليها المورد الذي تم اعتراضه بواسطة المرشح بواسطة حاوية Servlet. يمكن أن يكون أحد الطلبات ، وتضمين ، وأمام وخطأ ، والطلب الافتراضي. يمكن للمستخدمين تعيين عناصر فرعية <Sidatcher> المتعددة لتحديدها
تصفية اعتراض طرق مختلفة لاستدعاء الموارد. على النحو التالي:
<Filter-Mapping> <filter-name> testFilter </filter-name> <url-pattern> /index.jsp </url-pattern> <sistatcher> طلب </dispatcher> <spatcher> إلى الأمام </dispatcher> </filter mapping>
القيم التي يمكن لعنصر الطفل ضبطها ومعانيها:
1.request: عندما يصل المستخدم مباشرة إلى الصفحة ، ستستدعي حاوية الويب المرشح. إذا تم الوصول إلى المورد المستهدف من خلال طريقة Include () أو Forward () لـ requestDispatcher ، فلن يتم استدعاء المرشح.
2. التاكسي: إذا تم الوصول إلى المورد المستهدف من خلال طريقة required () من requestDispatcher ، فسيتم استدعاء المرشح. بخلاف ذلك ، لن يتم استدعاء المرشح.
3. إذا تم الوصول إلى المورد المستهدف من خلال طريقة REQUESTDISPATCHER للأمام () ، فلن يتم استدعاء المرشح ، ولن يتم استدعاء المرشح بالإضافة إلى ذلك.
4.error: إذا تم استدعاء المورد المستهدف من خلال آلية معالجة الاستثناءات التعريفية ، فسيتم استدعاء المرشح. بخلاف ذلك ، لن يتم استدعاء المرشح.