تقدم هذه المقالة بشكل أساسي اعتراض springmvc ، على النحو التالي:
1. Dispatcherservlet
لدى springMVC مرسى إدخال موحد ، وجميع الطلبات تمر عبر Dispatcherservlet.
Dispatcherservlet هو مُتكوين مسبقًا في ملف web.xml. لاعتراض الطلبات المطابقة ، يجب تحديد قواعد مطابقة اعتراض Servlet بنفسها ، ويجب توزيع الطلبات المعتادة على وحدة التحكم المستهدفة وفقًا لقواعد معينة للمعالجة. لذلك نضيف الآن التكوين التالي إلى web.xml:
<!-عند تهيئة Dispatcherservlet ، يبحث الإطار عن ملف يسمى [servlet-name] -servlet.xml في دليل الويب الخاص بتطبيق الويب ، ويحدد الفاصوليا ذات الصلة هناك ، ويتجاوز أي حبوب محددة عالميًا-> <servlet> <Srevlet-Class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <load-on-startup> 1 </load-on-rectup> </stervlet> </servlet mapping>
2. الموارد الثابتة لا تعترض
إذا قمت فقط بتكوين اعتراض عناوين URL مماثلة لتنسيق *.do ، فلا توجد مشكلة في الوصول إلى الموارد الثابتة. ومع ذلك ، إذا كان التكوين يعترض جميع الطلبات (مثل "/" قمنا بتكوينه أعلاه) ، فسيؤدي ذلك إلى موارد ثابتة مثل ملفات JS وملفات CSS وملفات الصور.
بشكل عام ، يتم تنفيذ التقاطع بشكل أساسي لإدارة الإذن ، وذلك اعتراض بعض طلبات URL بشكل أساسي ، لذلك لا يتم اعتراض الموارد الثابتة. هناك عمومًا طريقتان لتصفية الموارد الثابتة.
الأول هو استخدام <mvc: default-servlet-servledler /> (عمومًا ، اسم servlet الافتراضي لخادم تطبيق الويب هو "افتراضي" ، لذلك نحن هنا ننشط DefaultServlet من Tomcat لمعالجة الملفات الثابتة ، وتكوين الكود التالي في web.xml :)
<!- يتم توفير servlet لحاويات مثل tomcat ، jetty ، وما إلى ذلك ، ويغير تعيين الموارد الثابت من / إلى / ثابت / الدليل. على سبيل المثال ، عندما زرت http: //localhost/foo.css ، الآن http: //localhost/static/foo.css-> <!-لا تعترض الملفات الثابتة-> </url-mapping> <Sradlet-name> الافتراضي </servlet-name> <Url-pattern> <Url-pattern>/css/*</url-pattern> <url-pattern>/images/*</url-pattern> <url-pattern>/fonts/*</url-pattern> </servlet mapping>
Tomcat ، Jetty ، Jboss ، و Glassfish اسم servlet الافتراضي-"الافتراضي"
راتنج اسم servlet الافتراضي --- "ملف الراتنج"
WebLogic Default Servlet Name-"Fileservlet"
WebSphere Default Servlet Name-"SimpleFileservlet"
إذا لم يكن اسم Servlet الافتراضي لجميع خوادم تطبيق الويب الخاصة بك "افتراضيًا" ، فأنت بحاجة إلى عرض المحدد عبر خاصية اسم الخدمات الافتراضية:
<MVC: Default-Servlet-Servault-Servlet-Name = "اسم servlet يستخدمه خادم الويب بشكل افتراضي" />
النوع الثاني هو استخدام <mvc: الموارد /> وأضف الكود التالي إلى ملف تكوين springMVC:
<mvc: Mapping الموارد = "/js/**" location = "/static_resources/javaScript/"/> <mvc: الموارد mapping = "/styles/**" location = "/static_resources/css/"/>
3. اعتراض مخصص
يوفر معالج اعتراض SPRINGMVC ثلاثة طرق prehandle و posthandle و eletcompletion. يتم استدعاء Prehandle قبل معالج الخدمة الطلب ،
يتم تنفيذ Posthandle بعد أن يكمل معالج الأعمال تنفيذ الطلب ويولد العرض. يتم استدعاء AfterCompletion بعد معالجة Dispatcherservlet بالكامل ويمكن استخدامها لتنظيف الموارد ، وما إلى ذلك ، لذلك ، من أجل تنفيذ منطق إدارة الإذن الخاص بك ، تحتاج إلى ورث المعالجات المعالج وإعادة كتابة طرقها الثلاث.
أولاً ، أضف اعتراضتي المحددة إلى springmvc.xml. منطق التنفيذ الخاص بي المشترك.
<!-تكوين اعتراضات ، اعتراضات متعددة ، تنفيذ بالتتابع-> <mvc: interceptors> <mvc: interceptor> <!-يتطابق مع مسار URL. إذا لم تقم بتكوين أو/** ، فسيتم اعتراض جميع وحدات التحكم-> <mvc: mapping path = "/user/**"/> <mvc: mapping path = "/test/**"/> <bean> </bean> </mvc: interceptor> <! الترتيب -> </mvc: اعتراضات>
منطق اعتراضي هو "قبل تسجيل الدخول ، أي عنوان URL للوصول سوف يقفز إلى صفحة تسجيل الدخول ؛ بعد أن ينجح تسجيل الدخول ، القفز إلى عنوان URL السابق" ، فإن الكود المحدد هو كما يلي:
/ ** * */ package com.alibaba.Interceptor ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ استيراد org.slf4j.logger ؛ استيراد org.slf4j.loggerfactory ؛ استيراد org.springframework.web.servlet.modelandview ؛ استيراد org.springframework.web.servlet.handler.HandlerInterceptorAdapter ؛ استيراد com.alibaba.util.requestutil ؛ / ** * Author TFJ * 2014-8-1 */ public commonInterceptor يمتد مع معالج {private final logger log = loggerfactory.getLogger (commonInterceptor.Class) ؛ السلسلة النهائية الثابتة العامة last_page = "com.alibaba.lastpage" ؛ / * * استخدم رسم الخرائط العادية للمسار الذي يحتاج إلى اعتراض MapPingurl الخاص بالسلسلة الخاصة ؛ public void setMappingUrl (String Mappingurl) {this.mappingurl = mapingurl ؛ } * / / / ** * دعا قبل معالج الأعمال مع معالج الأعمال مع الطلب * إذا تم إرجاع خطأ * قم بتنفيذ جميع المعترضين بعد ذلك () من المعتشر الحالي ، ثم الخروج من سلسلة التقاطع * إذا تم تنفيذ التقاطع التالي حتى يتم تنفيذ جميع التقاطعات * تنفيذ وحدة تحكم التقاطع * ثم أدخل سلسلة التعاون ، * execute. postcompletion () من آخر اعتراض */ Override Public Boolean prehandle (httpservletrequest طلب ، httpservletresponse ، معالج الكائن) يلقي الاستثناء {if ( } log.info ("================ 执行顺序: 1 、 prehandle ================") ؛ String requesturi = request.getRequesturi () ؛ String ContextPath = request.getContextPath () ؛ url url = requesturi.substring (contextpath.length ()) ؛ log.info ("requesturi:"+requesturi) ؛ log.info ("ContextPath:"+ContextPath) ؛ log.info ("url:"+url) ؛ username username = (string) request.getSession (). getAttribute ("user") ؛ if (username == null) {log.info ("interceptor: اطلب إلى صفحة تسجيل الدخول!") ؛ request.getRequestDispatcher ("/web-inf/jsp/login.jsp"). العودة كاذبة } مرة أخرى ترجع صحيح ؛ } / *** بعد أن يكمل معالج الأعمال معالجة الطلب ، يتم تنفيذ الإجراء الذي تم تنفيذه قبل إنشاء العرض* يمكنك إضافة بيانات إلى ModelandView ، مثل الوقت الحالي* / Override public void posthandle (httpservletrequest request ، httpservletsponse ، honomer comforman ، modelandview request log.info ("=============================================================================================================================================== log.info ("===================================================================================== ========================================================================================================================== ============================================================================================================================ ========================================================================================================================== استجابة ، معالج الكائن ، استثناء) استثناء {log.info ("============== 执行顺序: 3 、 AfterCompletion ===============") ؛ ملاحظة: في الرمز أعلاه ، كتبت طلبًا ، والذي ينفذ بشكل أساسي وظائف مثل الحصول على الطلب الحالي ، وكائن الجلسة ، وحفظ الصفحات ، والخروج.
في هذه المرحلة ، تم تنفيذ التقاطع ، والتأثير كما هو موضح في الشكل:
سوف يتم حظرها من خلال الزيارة /الاختبار /مرحبًا مباشرة
بعد تسجيل الدخول بنجاح ، سوف يقفز إلى الصفحة المقابلة لـ /test /hello
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.