1. نظرة عامة
يتم استخدام التقاطعات أكثر فأكثر ، خاصة بعد شعبية برمجة الشريحة. إذن ما الذي يمكن أن يفعله المعترض عادة؟
في تقديمنا إلى الوكيل ، ذكرنا أن دعوة الوظائف الإحصائية تستغرق وقتًا. هذه الفكرة هي في الواقع نفس التحسين المحيطي لـ AOP.
بشكل عام ، السيناريو كما يلي:
وغيرها وما إلى ذلك.
2. اعتراض الربيع
سواء كان SPRINGMVC أو Springboot ، علينا أن نذكر التقاطع:
org.springframework.web.servlet.handler.handlerInterceptorAdapter
Public Abstract Class HandlerNtroctionorAdapter تنفذ AsynchandlerInterceptor {// execute Override Public Boolean prehandle (httpservletrequest request ، httpservletresponse response ، compland handler) يرمي الاستثناء {return true ؛ }. استجابة httpservletresponse ، معالج الكائن ، استثناء EX) يلقي الاستثناء {} // المستخدمة للتعامل مع الطلبات غير المتزامنة. سيتم تشغيل هذه الطريقة عندما يكون هناك طريقة طلب غير متزامن في وحدة التحكم في Override Public Void بعد ConcurrentHandlingLingStarted (طلب httpservletrequest ، استجابة httpservletresponse ، معالج الكائن) استثناء {}}تنفيذ اعتراض للتحقق من الأذونات البسيطة
1. تخصيص تعليق التعليق التوضيحي @Auth
@ernorted@target ({elementType.type ، elementType.method})@entry(retentionpolicy.runtime)@documentedpublic interface Auth {String user () افتراضي "؛}2. أضف التعليقات التوضيحية إلى طريقة وحدة التحكم
بعد إضافة التعليقات التوضيحية في الخطوة السابقة ، يجب عليك إضافة التعليقات التوضيحية ذات الصلة إلى الطريقة التي تستخدمها ، على النحو التالي.
@RESTCONTROLLER @ENABLEAUTOCONFIGURITPERCEPPARCERPARCERPARBERCERS DEMOCONTROLLER {Auth (user = "admin") @requestmapping (value = "/hello" ، method = requestMethod.get) public string salehello () {return "Hello World." ؛ }}3. تنفيذ وظيفة التقاطع
المتطلبات: عندما يصل المستخدم إلى URI من خلال /Hello ، يتم التحقق منه. إذا كان المسؤول ، فسيتم إصداره ، وإلا سيتم رفضه. افترض أن هوية المستخدم في معلمة عنوان URL.
فكرة: لذلك ، نحن بحاجة إلى التحقق من المستخدم قبل تنفيذ Sealhello (). إذا كانت هويتها هي نفس الهوية في التعليق التوضيحي ، فسيتم إصدارها. لذلك ، نحن بحاجة إلى إثارة ضجة في prehandle ().
الصعوبة: كيف نحصل على تعليق توضيحي على طريقة وحدة التحكم؟ بالنظر إلى المعلمات الثلاثة لـ Prehandle () ، يبدو أنه لا يمكن لأحد تقديم تعليقات توضيحية في فئة وحدة التحكم.
في الواقع ، فإن معالج المعلمة الثالث ، بشكل عام ، هو: org.springframework.web.method.handlermethod ، ويحتوي على معلومات ذات صلة حول التعليقات التوضيحية.
لماذا تقول ذلك؟
في Springboot ، يكون النوع الافتراضي للشرح هو مستوى الوظيفة ، بينما في SPRINGMVC هو نوع كائن وحدة التحكم في springMVC.
لذلك ، إذا كنت بحاجة إلى تكوينه في Servatcher-Servlet.xml في springMVC:
<bean/> ، بحيث يكون نوعه معالجة.
دعونا نلقي نظرة على منطق التنفيذ المحدد:
Override Public Boolean Prehandle (HttpservletRequest request ، httpservletresponse ، rems stisply {system.out.println ("prehandle") ؛ if (! handler.getClass (). isAsSignableFrom (handlermethod.class)) {system.out.println ("Cat cast handler to handlermethod.class") ؛ العودة صحيح. } // الحصول على Auth Auth Auth = ((Handlermethod) معالج) .getMethod (). getAnnotation (auth.class) ؛ if (auth == null) {system.out.println ("لا يمكن العثور على auth في هذا uri:" + request.getRequesturi ()) ؛ العودة صحيح. } // أخرج هوية المستخدم من المعلمات والتحقق من string admin = auth.user () ؛ if (! admin.equals (request.getParameter ("user"))) {system.out.println ("SERMISSE REFIDE") ؛ استجابة. setstatus (403) ؛ العودة كاذبة } إعادة صواب ؛ }في الواقع ، هناك نقطتان في منطق التنفيذ: أخرج الهوية من المعلمات وقارنها مع التعليقات التوضيحية.
4. تكوين التقاطع
فكيف يمكن أن يكون التقاطع فعالًا الآن؟
في هذا الوقت ، نحتاج إلى تكوين: WebMVCConfigureRadapter
التنفيذ المحدد هو كما يلي:
ConfigurationPublic Class ConfigAdapter يمتد webmvcConfigureRadapter {Override public void additpectors (interceptorregistry registry) {registry.adDinterceptor (new loginInterceptor ()). addathpatterns ("/hell") ؛ }}ملاحظة: هناك نقطتان يجب ملاحظته هنا. أحدهما هو توضيح التكوين ، بحيث يمكن لخدمة Springboot اكتشاف هذا التكوين ؛ والآخر هو تطابق التكوين ، وهو اعتراض "/hello". ("/**" لمنع جميع الوصول)
4. العملية
تفضل بزيارة http://127.0.0.1:8080/hello؟user=admin لرؤية النتائج.
للحصول على تفاصيل الرمز في هذه المقالة ، يرجى الرجوع إلى: https://github.com/hawkingfoo/springboot-
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.