1. ภาพรวม
ตัวดักถูกใช้มากขึ้นเรื่อย ๆ โดยเฉพาะอย่างยิ่งหลังจากความนิยมของการเขียนโปรแกรมชิ้น ดังนั้นการดักจับมักจะทำอะไร?
ในการแนะนำตัวแทนของเราเรากล่าวว่าการเรียกฟังก์ชั่นทางสถิติต้องใช้เวลา ความคิดนี้เป็นจริงเหมือนกันกับการเพิ่มประสิทธิภาพรอบทิศทางของ AOP
โดยทั่วไปแล้วสถานการณ์มีดังนี้:
และอื่น ๆ และอื่น ๆ
2. สกัดกั้นของฤดูใบไม้ผลิ
ไม่ว่าจะเป็น SpringMVC หรือ Springboot เราต้องพูดถึงตัวดัก:
org.springframework.web.servlet.handler.handlerinterceptoradapter
บทคัดย่อคลาสสาธารณะ HandlerInterceptorAdapter ใช้ AsynchandlerInterceptor {// ดำเนินการ @Override Public Boolean Prehandle (คำขอ httpservletRequest, การตอบสนอง httpservletResponse, ตัวจัดการวัตถุ) โยนข้อยกเว้น {return true; } // ดำเนินการหลังจากวิธีการเป้าหมายถูกดำเนินการ แต่ก่อนที่คำขอจะส่งคืนเรายังคงสามารถแก้ไข modelandview @Override โมฆะสาธารณะ postthandle (httpservletrequest Request, httpservletResponse การตอบสนอง การตอบสนอง httpservletResponse, ตัวจัดการวัตถุ, Exception Ex) โยนข้อยกเว้น {} // ใช้เพื่อจัดการคำขอแบบอะซิงโครนัส วิธีนี้จะถูกทริกเกอร์เมื่อมีวิธีการร้องขอแบบอะซิงโครนัสในโมฆะ @Override สาธารณะ AfterconcurrentHandlingStarted (HTTPSERVLETREQUEST Request, HTTPSERVLETRESSSESSENTใช้ interceptor สำหรับการตรวจสอบสิทธิ์อย่างง่าย
1. ปรับแต่งคำอธิบายประกอบการอนุญาต @auth
@สืบทอด@target ({elementType.type, elementType.method})@retention(retentionPolicy.runtime)@documentedPublic @interface Auth {String user () ค่าเริ่มต้น "";}2. เพิ่มคำอธิบายประกอบเข้ากับวิธีการคอนโทรลเลอร์
หลังจากเพิ่มคำอธิบายประกอบในขั้นตอนก่อนหน้าคุณควรเพิ่มคำอธิบายประกอบที่เกี่ยวข้องกับวิธีที่คุณใช้ดังนี้
@restcontroller @enableautoconfigurationPublic คลาส DeMocontroller {@auth (user = "admin") @requestmapping (value = "/hello", method = requestmethod.get) สตริงสาธารณะ Sayshello () {return "Hello World"; -3. ใช้ฟังก์ชัน interceptor
ข้อกำหนด: เมื่อผู้ใช้เข้าถึง URI ผ่าน /สวัสดีจะได้รับการตรวจสอบแล้ว หากเป็นผู้ดูแลระบบจะได้รับการปล่อยตัวมิฉะนั้นจะถูกปฏิเสธ สมมติว่าตัวตนของผู้ใช้อยู่ในพารามิเตอร์ URL
แนวคิด: ดังนั้นเราต้องตรวจสอบผู้ใช้ก่อนที่จะดำเนินการ Sayshello () หากตัวตนของมันเหมือนกับตัวตนในคำอธิบายประกอบมันจะถูกปล่อยออกมา ดังนั้นเราต้องทำเอะอะใน prehandle ()
ความยาก: เราจะได้รับคำอธิบายประกอบ @auth บนวิธีคอนโทรลเลอร์ได้อย่างไร? เมื่อดูที่พารามิเตอร์สามตัวของ prehandle () ดูเหมือนว่าไม่มีใครสามารถให้คำอธิบายประกอบในคลาสคอนโทรลเลอร์
ในความเป็นจริงตัวจัดการพารามิเตอร์ที่สามโดยทั่วไปประเภทของมันคือ: org.springframework.web.method.handlermethod และมีข้อมูลที่เกี่ยวข้องเกี่ยวกับคำอธิบายประกอบ
ทำไมคุณถึงพูดอย่างนั้น?
ใน Springboot ประเภทของคำอธิบายประกอบเริ่มต้นคือระดับฟังก์ชันในขณะที่ใน SpringMVC ประเภทเริ่มต้นคือระดับวัตถุคอนโทรลเลอร์
ดังนั้นหากคุณต้องการกำหนดค่าใน dispatcher-servlet.xml ใน SpringMVC:
<ถั่ว/> เพื่อให้ประเภทของมันเป็นวิธีการดูแล
ลองดูที่ตรรกะการใช้งานเฉพาะ:
@Override บูลีนสาธารณะ prehandle (คำขอ httpservletrequest, การตอบสนอง httpservletResponse, handler วัตถุ) โยนข้อยกเว้น {system.out.println ("prehandle"); if (! handler.getClass (). isAssignableFrom (handlermethod.class)) {system.out.println ("cat cast handler to handlermethod.class"); กลับมาจริง; } // รับ ANNOTATION AUTH AUTH = ((HandlerMethod) Handler) .getMethod (). getAnnotation (auth.class); if (auth == null) {system.out.println ("ไม่พบ @auth ใน URI นี้:" + request.getRequesturi ()); กลับมาจริง; } // นำข้อมูลประจำตัวของผู้ใช้ออกจากพารามิเตอร์และตรวจสอบสตริง admin = auth.user (); if (! admin.equals (request.getParameter ("ผู้ใช้"))) {system.out.println ("การอนุญาตปฏิเสธ"); Response.SetStatus (403); กลับเท็จ; } return true; -ในความเป็นจริงมีสองจุดในตรรกะการใช้งาน: นำตัวตนออกจากพารามิเตอร์และเปรียบเทียบกับคำอธิบายประกอบ
4. กำหนดค่า interceptor
ดังนั้นการสกัดกั้นจะมีประสิทธิภาพได้อย่างไร?
ในเวลานี้เราจำเป็นต้องกำหนดค่า: webmvcconfigureradapter
การใช้งานเฉพาะมีดังนี้:
@ConfigurationPublic class configadapter ขยาย WebMVCCONFigurerAdapter {@Override โมฆะสาธารณะ addInterceptors (InterceptorRegistry Registry) {registry.addinterceptor (ใหม่ loginInterceptor ()). addPathPatterns ("/hello"); -หมายเหตุ: มีสองจุดที่ควรทราบที่นี่ หนึ่งคือคำอธิบายประกอบ @Configuration เพื่อให้บริการ SpringBoot สามารถค้นพบการกำหนดค่านี้ อีกอย่างคือการจับคู่การกำหนดค่าซึ่งก็คือการสกัดกั้น "/สวัสดี" ("/**" คือการบล็อกการเข้าถึงทั้งหมด)
4. การดำเนินการ
เยี่ยมชม http://127.0.0.1:8080/hello?user=admin เพื่อดูผลลัพธ์
สำหรับรายละเอียดของรหัสในบทความนี้โปรดดูที่: https://github.com/hawkingfoo/springboot-interceptor
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น