مقدمة للفلتر
يسمى المرشح أيضًا مرشحًا. إنها التكنولوجيا الأكثر عملية في تكنولوجيا Servlet. من خلال تقنية التصفية ، يعترض مطورو الويب جميع موارد الويب التي تديرها خوادم الويب: مثل JSP أو Servlet أو ملفات الصور الثابتة أو ملفات HTML الثابتة ، وبالتالي تحقيق بعض الوظائف الخاصة. على سبيل المثال ، قم بتنفيذ بعض الوظائف المتقدمة مثل التحكم في الوصول إلى أذونات عنوان URL ، وتصفية المفردات الحساسة ، وضغط معلومات الاستجابة.
يتم استخدامه بشكل أساسي للمعالجة المسبقة لطلبات المستخدمين ، ويمكن أيضًا تشغيل HttPservletResponse بعد العملية. العملية الكاملة لاستخدام Filter: Filter Preprocesses طلبات المستخدم ، ثم تسليم الطلب إلى Servlet لمعالجة وإنشاء استجابة ، وأخيراً تقوم بتصفية استجابة الخادم.
وظيفة المرشح
1. اعتراض httpservletrequest للعميل قبل وصول httpservletrequest إلى servlet. تحقق من httpservletrequest حسب الحاجة ، ويمكنك أيضًا تعديل رأس وبيانات httpservletrequest.
2. اعتراض httpservletresponse قبل أن يصل إلى العميل. تحقق من httpservletresponse حسب الحاجة ، ويمكنك أيضًا تعديل رأس وبيانات httpservletresponse.
كيفية استخدام مرشح لتنفيذ وظيفة الاعتراض
هناك طريقة dofilter في واجهة المرشح. عندما يكتب المطور التصفية وتكوين مورد الويب الذي يجب اعتراضه ، سيقوم خادم الويب بالاتصال بأسلوب dofilter للمرشح في كل مرة قبل الاتصال بطريقة الخدمة لمورد الويب. لذلك ، يمكن للكتابة في هذه الطريقة تحقيق الغرض التالي:
1. دع جزءًا من الكود ينفذ قبل استدعاء المورد الهدف.
2. ما إذا كان يجب استدعاء المورد المستهدف (أي ، سواء للسماح للمستخدمين بالوصول إلى مورد الويب).
عندما يستدعي خادم الويب طريقة DoFilter ، فإنه سيمرر كائن FilterChain. كائن FilterChain هو الكائن الأكثر أهمية في واجهة التصفية. كما يوفر طريقة dofilter. يمكن للمطورين أن يقرروا ما إذا كان يجب استدعاء هذه الطريقة وفقًا لاحتياجاتهم. إذا تم استدعاء هذه الطريقة ، فسيقوم خادم الويب بالاتصال بأسلوب الخدمة لمورد الويب ، أي أنه سيتم الوصول إلى مورد الويب ، وإلا فلن يتم الوصول إلى مورد الويب.
تصفية تطوير خطوتين
اكتب فئة Java لتنفيذ واجهة Filter وتنفيذ طريقة Dofilter الخاصة بها.
الاستخدام والعناصر في ملف web.xml لتسجيل فئة التصفية المكتوبة وتعيين الموارد التي يمكن أن يعترضها.
مقدمة إلى العقد التكوين web.xml:
يتم استخدام عنصر <filter-Mapping> لتعيين المورد الذي يكون المرشح مسؤولاً عن الاعتراض. يمكن تحديد مرشح مورد يمكن تحديده بطريقتين: اسم servlet ومسار الطلب للوصول إلى الموارد.
<Sradlet-Name> يحدد اسم Servlet الذي تم اعتراضه بواسطة المرشح.
يحدد <Sidatcher> الطريقة التي يطلق عليها المورد الذي تم اعتراضه بواسطة المرشح بواسطة حاوية Servlet. يمكن أن يكون أحد الطلبات ، وتضمين ، وأمام وخطأ ، والطلب الافتراضي. يمكن للمستخدمين تعيين عناصر فرعية متعددة <Dispatcher> لتحديد التصفية لاعتراض طرق مختلفة لاتصال الموارد.
القيمة والمعنى الذي يمكن أن يضبطه عنصر الطفل على النحو التالي
سلسلة مرشح
في تطبيق الويب ، يمكن تطوير مرشحات متعددة وكتابتها ، والتي يتم دمجها في سلسلة مرشح واحدة.
يقرر خادم الويب المرشح الذي يجب الاتصال به أولاً وفقًا للترتيب الذي يتم فيه تسجيل التصفية في ملف web.xml. عند استدعاء طريقة Dofilter للمرشح الأول ، سيقوم خادم الويب بإنشاء كائن FilterChain الذي يمثل سلسلة المرشح ونقله إلى الطريقة. في طريقة Dofilter ، إذا قام المطور باستدعاء طريقة dofilter لكائن FilterChain ، فسيتحقق خادم الويب ما إذا كان لا يزال هناك مرشح في كائن FilterChain. إذا كان هناك ، يتم استدعاء المرشح الثاني ، وإذا لم يكن هناك ، فسيتم استدعاء المورد المستهدف.
دورة حياة المرشح
init public void (filterConfig filterConfig) يلقي servletexception ؛ // التهيئة
مثل برنامج Servlet الذي نكتبه ، فإن إنشاء وتدمير المرشح هو مسؤولية خادم الويب. عند بدء تشغيل تطبيق الويب ، سيقوم خادم الويب بإنشاء كائن مثيل للفلتر واتصل طريقة init الخاصة به لقراءة تكوين web.xml لإكمال وظيفة تهيئة الكائن ، وبالتالي التحضير لاعتراض طلبات المستخدم اللاحقة (سيتم إنشاء كائن المرشح مرة واحدة فقط ، وسيتم تنفيذ طريقة init مرة واحدة فقط). يمكن للمطورين الحصول على كائن FilterConfig الذي يمثل معلومات تكوين المرشح الحالية من خلال معلمات طريقة init.
dofilter public void (طلب servletRequest ، استجابة servletResponse ، سلسلة filterchain) يلقي ioException ، servlexception ؛ // intercept request
تكمل هذه الطريقة عملية التصفية الفعلية. عندما يطلب العميل الوصول إلى عنوان URL المرتبط بالمرشح ، سيقوم مرشح Servlet أولاً بتنفيذ طريقة Dofilter. يتم استخدام معلمة FilterChain للوصول إلى المرشحات اللاحقة.
تدمير الفراغ العام () ؛ // تدمير
سيقيم كائن المرشح في الذاكرة بعد الإنشاء وسيتم تدميره عند إزالة تطبيق الويب أو إيقاف الخادم. استدعاء قبل حاوية الويب تقوم بإلغاء تثبيت كائن المرشح. يتم تنفيذ هذه الطريقة مرة واحدة فقط خلال دورة حياة المرشح. في هذه الطريقة ، يمكن تحرير الموارد التي يستخدمها المرشح.
FilterConfig واجهة
عند تكوين المرشحات ، يمكن للمستخدمين تكوين بعض معلمات التهيئة للمرشحات. عندما تقوم حاوية الويب بتسوية كائن المرشح وتدعو طريقة init الخاصة بها ، فسيتم تمريرها في كائن FilterConfig الذي يلف معلمات تهيئة المرشح. لذلك ، عندما يكتب المطورون مرشحات ، يمكنهم الحصول على المحتوى التالي من خلال طريقة كائن FilterConfig:
سلسلة getFiLtername () ؛ // احصل على اسم المرشح. سلسلة getInitParameter (اسم السلسلة) ؛ // إرجاع قيمة معلمة التهيئة مع الاسم المحدد في وصف النشر. إذا لم يكن هناك وجود ، عودة لاغية. تعداد getInitParameterNames () ؛ // إرجاع مجموعة التعداد من أسماء جميع معلمات التهيئة للمرشح. ServiletContext public GetServletContext () ؛ // إرجاع إشارة إلى كائن سياق servlet.
حالات استخدام المرشح
استخدم مرشح للتحقق من التحكم في أمان تسجيل الدخول إلى المستخدم
شاركت في الحفاظ على مشروع منذ بعض الوقت. بعد خروج المستخدم من النظام ، ذهب إلى شريط العناوين للوصول إلى التاريخ. وفقًا لعنوان URL ، لا يزال بإمكانه إدخال صفحة استجابة النظام. لقد راجعت ووجدت أنه لم يتم ترشيح الطلب والتحقق من تسجيل الدخول إلى تسجيل الدخول. أضف مرشحًا لحل المشكلة!
قم بتكوينه أولاً في web.xml
<ilipter> <iliter-name> sessionfilter </filter-name> <ilter-class> com.action.login.sessionFilter </filter-class> <Ing-param> <Param-Name> Logenstrings </param-name> <!-لا ترشح صفحة تسجيل الدخول-> <Param-value> <Ing-param> <Param-Name> includeStrings </param-name> <!-تصفية فقط لاحقة معلمة المرشح المحددة-> <param-value> .do ؛ .jsp </param-value> </ith-param> <Ing-param> <parm-name> redirectpath </param-name> <Param-value> /index.jsp </parm-value> </ith-param> <Ing-param> <Param-name> disableTestFilter </param-name> <!-y: filter invalid-> <param-value> n </parm-value> <! </ith-param> </filter> <filter-mapping> <filter-name> SessionFilter </filter-name> <url-pattern>/*</url-pattern> </filter mapping>
ثم اكتب filterservlet.java:
package com.action.login ؛ import java.io.ioException ؛ استيراد javax.servlet.filter ؛ استيراد javax.servlet.filterchain ؛ استيراد javax.servlet.filterConfig ؛ استيراد javax.servletexception javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.htpservletresponse ؛ import javax.servlet.http.httpservletresponsewrapper ؛/*** حدد ما إذا كان المستخدم قد تم تسجيل الدخول ، وإذا لم يتم تسجيله ، http://www.manongjc.com/article/1613.html */public class sessionfilter firements {public filterConfig config ؛ void public destroy () {this.config = null ؛ } isContains الثابتة العامة (حاوية سلسلة ، سلسلة [] regx) {boolean result = false ؛ لـ (int i = 0 ؛ i <regx.length ؛ i ++) {if (container.indexof (regx [i])! = -1) {return true ؛ }} نتيجة الإرجاع ؛ } public void dofilter (servletRequest request ، servletResponse ، سلسلة filterchain) يلقي iOexception ، servleTexception {httpservletrequest hrequest = (httpservletrequest) ؛ httpservletresponsewrapper clospper = new httpservletResponseWrapper ((httpservletresponse)) ؛ تسجيلات السلسلة = config.getInitParameter ("logronsrings") ؛ // تسجيل الدخول إلى سلسلة صفحة تسجيل الدخول includeStrings = config.getInitParameter ("includeStrings") ؛ . // لا يوجد تسجيل دخول إلى سلسلة Turn Brage DisableTestFilter = config.getInitParameter ("DisabletestFilter") ؛ // هو المرشح الصحيح إذا (disabletestfilter.touppercase (). يعود؛ } string [] logonList = logrontrings.split ("؛") ؛ String [] includeList = includeStrings.split ("؛") ؛ if (! this.iscontains (hrequest.getRequesturi () ، includelist)) {// فقط تصفية سلسلة Failter factix chain.dofilter المحددة (طلب ، استجابة) ؛ يعود؛ } if (this.iscontains (hrequest.getRequesturi () ، logonlist)) {// لا ترشح سلسلة صفحة تسجيل الدخول. يعود؛ } string user = (string) hrequest.getSession (). getAttribute ("useronly") ؛ // upply ما إذا كان المستخدم قد تم تسجيل الدخول إذا (user == null) {wrapper.sendredirect (redirectpath) ؛ يعود؛ } آخر {chain.dofilter (طلب ، استجابة) ؛ يعود؛ }} public void init (filterConfig filterConfig) يلقي servleTexception {config = filterConfig ؛ }}وبهذه الطريقة ، يمكن إكمال جميع الطلبات إلى المستخدم ، ويجب التحقق من تسجيل دخول المستخدم من خلال هذا المرشح.
منع المرشحات المشوهة الصينية
عندما يستخدم المشروع إطار الربيع. عند استخدام مجموعات الأحرف المختلفة في صفحة JSP الحالية ورمز Java للترميز ، ستكون هناك مشاكل مشوهة مع بيانات إرسال النموذج أو تحميل/تنزيل ملفات الأسماء الصينية. ثم يمكنك استخدام هذا المرشح.
<Ivilter> <ilter-name> الترميز </filter-name> <lipter-class> org.springframework.web.filter.characterencodingfilter </filter-class> </ith-param> <Ing-param> <Param-Name> ForceenCoding </param-name> <!-صحيح: بغض النظر عما إذا كان الطلب قد حدد مجموعة أحرف ، يتم استخدام الترميز ؛ خطأ: إذا كان الطلب قد حدد مجموعة أحرف ، فلا يتم استخدام الترميز-> <param-value> false </param-value> </ith-param> </filter> <filter mapping> <filter-name> الترميز </filter-name> <url-pattern>/*</url-pattern> </filed
يتحكم OpenSessionInviewFilter الخاص بـ Spring+Hibernate
عند استخدام Hibernate+Spring بالاقتران معها ، إذا تم تعيين Lazy = True (تم تأخير التحميل) ، ثم عند قراءة البيانات ، ستغلق Hibernate الجلسة تلقائيًا بعد قراءة البيانات الأصل. وبهذه الطريقة ، عندما تريد استخدام البيانات المرتبطة بالبيانات وبيانات الطفل ، فإن النظام سوف يرمي خطأً كسولًا. في هذا الوقت ، تحتاج إلى استخدام مرشح OpenSessionInViewFilter المقدم من الربيع.
يحتفظ OpenSessionInViewFilter بشكل أساسي بحالة الجلسة حتى يرسل الطلب جميع الصفحات إلى العميل ، ولا يغلق الجلسة حتى يكتمل الطلب ، وذلك لحل المشكلات الناجمة عن التحميل كسول.
ملاحظة: يجب كتابة تكوين OpenSessionInViewFilter أمام تكوين Struts2. نظرًا لأن حاوية tomcat يتم تحميلها بالتسلسل عند تحميل المرشح ، إذا كتب ملف التكوين أولاً تكوين المرشح لـ Struts2 ، ثم تكوين مرشح OpenSessionInViewFilter ، فإن ترتيب التحميل لا يتم إدارة الجلسة في الربيع عند الحصول على البيانات.
<ilter> <!-تم تمكين التحميل كسول في الربيع-> <filter-name> OpenSessionInViewFilter </filter-name> <filter-class> org.springframework.orm.hibernate3 بشكل افتراضي ، الفول مع معرف كمعرف SessionFactory من حاوية الربيع. إذا لم يكن المعرف SessionFactory ، فأنت بحاجة إلى تكوينه على النحو التالي. هنا ، SessionFactory هو الفول في حاوية الربيع. -> <Param-value> SessionFactory </parm-value> </ith-param> <Ing-param> <Param-Name> Singlesession </param-name> <!-الافتراضات العزفية على صواب ، إذا تم تعيينها على خطأ ، فلا تساوي عدم استخدام OpenSessionInview-> <param-value> <Filter-Name> OpenSessionInViewFilter </filter-name> <url-pattern>*. do </url-pattern> </filter mapping>
تكوين web.xml من Struts2
لاستخدام Struts2 في المشروع ، تحتاج أيضًا إلى تكوين مرشح في web.xml لاعتراض الطلبات والانتقال إلى إجراء Struts2 للمعالجة.
ملاحظة: إذا كان في إصدار Struts2 قبل 2.1.3 ، يستخدم المرشح org.apache.struts2.dispatcher.filterDispatcher. وإلا استخدم org.apache.struts2 بدءًا من الدعامات 2.1.3 ، سيتم التخلي عن مرشح ActionContextCleanup ، بينما يتم تضمين الوظيفة المقابلة في مرشح StrutSprepareAxecuteFilter.
تم تكوين ثلاث معلمات التهيئة:
<!-Struts 2.x filter-> <lipter> <filter-name> Struts2 </filter-name> <ilter-class> org.apache.struts2 <url-pattern>*. do </url-pattern> </filter-mapping>
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!