บทความนี้ส่วนใหญ่แนะนำตัวดักจับ SpringMVC ดังนี้:
1.Dispatcherservlet
SpringMVC มีการเข้าร่วมแบบครบวงจรและคำขอทั้งหมดผ่าน DispatchERServlet
DispatchERServlet เป็นตัวควบคุมล่วงหน้าที่กำหนดค่าไว้ในไฟล์ web.xml ในการสกัดกั้นการร้องขอการจับคู่กฎการจับคู่ Servlet จะต้องกำหนดด้วยตัวเองและคำขอที่ถูกสกัดกั้นจะถูกแจกจ่ายไปยังตัวควบคุมเป้าหมายตามกฎบางอย่างสำหรับการประมวลผล ดังนั้นตอนนี้เราเพิ่มการกำหนดค่าต่อไปนี้ใน web.xml:
<!-เมื่อเริ่มต้น DispatchERSerVlet เฟรมเวิร์กจะมองหาไฟล์ชื่อ [servlet-name] -servlet.xml ในไดเรกทอรีเว็บแอปพลิเคชัน Web-Inf และกำหนดถั่วที่เกี่ยวข้อง <servlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
2. ทรัพยากรคงที่ไม่สกัดกั้น
หากคุณกำหนดค่าการสกัดกั้น URL ที่คล้ายกับรูปแบบ *.do เท่านั้นไม่มีปัญหาในการเข้าถึงทรัพยากรคงที่ อย่างไรก็ตามหากการกำหนดค่าสกัดกั้นคำขอทั้งหมด (เช่น "/" เรากำหนดค่าข้างต้น) มันจะทำให้ทรัพยากรคงที่เช่นไฟล์ JS, ไฟล์ CSS และไฟล์รูปภาพไม่สามารถเข้าถึงได้
โดยทั่วไปแล้วการดักจับส่วนใหญ่จะถูกนำไปใช้เพื่อการจัดการการอนุญาตส่วนใหญ่สกัดกั้นคำขอ URL บางอย่างดังนั้นทรัพยากรคงที่จึงไม่ถูกดักจับ โดยทั่วไปมีสองวิธีในการกรองทรัพยากรคงที่
อันแรก คือการใช้ <MVC: Default-Servlet-Handler /> (โดยทั่วไปชื่อ Servlet เริ่มต้นของเว็บแอปพลิเคชันเซิร์ฟเวอร์คือ "เริ่มต้น" ดังนั้นที่นี่เราเปิดใช้งานค่าเริ่มต้นของ Tomcat เพื่อประมวลผลไฟล์คงที่และกำหนดค่ารหัสต่อไปนี้ใน web.xml :)
<!- servlet มีไว้สำหรับคอนเทนเนอร์เช่น Tomcat, Jetty ฯลฯ และเปลี่ยนการแมปทรัพยากรแบบคงที่จาก / ถึง / directory / directory ตัวอย่างเช่นเมื่อคุณเยี่ยมชม http: //localhost/foo.css ตอนนี้ http: //localhost/static/foo.css-> <!-อย่าสกัดกั้นไฟล์คงที่-> <servlet-mapping> <servlet-name> <url-pattern>/css/*</url-pattern> <url-pattern>/images/*</url-pattern> <url-pattern>/Fonts/*</url-pattern> </servlet-mapping>
Tomcat, Jetty, Jboss และ Glassfish ชื่อของ Servlet เริ่มต้น-"default"
เรซินชื่อของ servlet เริ่มต้น --- "resin-file"
Weblogic ชื่อ servlet เริ่มต้น-"fileservlet"
WebSphere ชื่อ servlet เริ่มต้น-"SimpleFileserVlet"
หากชื่อ servlet เริ่มต้นของเซิร์ฟเวอร์แอปพลิเคชันเว็บทั้งหมดของคุณไม่ใช่ "เริ่มต้น" คุณต้องแสดงที่ระบุผ่านคุณสมบัติ default-servlet-name:
<MVC: Default-Servlet-Handler Default-Servlet-Name = "ชื่อ servlet ที่ใช้โดยเว็บเซิร์ฟเวอร์โดยค่าเริ่มต้น" />
ประเภทที่สองคือการใช้ <MVC: ทรัพยากร /> และเพิ่มรหัสต่อไปนี้ในไฟล์กำหนดค่า SpringMVC:
<MVC: การแม็พทรัพยากร = "/js/**" ตำแหน่ง = "/static_resources/javascript/"/> <mvc: การแม็พทรัพยากร = "/สไตล์/**" ตำแหน่ง = "/static_resources/css/"/> <mvc: การทำแผนที่ทรัพยากร = "/**"
3. Interceptor ที่กำหนดเอง
Interceptor HandlerInterceptorAdapter ของ SpringMVC ให้วิธี prehandle, prehandle, postthandle สามวิธีและวิธีการหลังจากนั้น Prehandle เรียกว่าก่อนที่หน่วยประมวลผลบริการจะดำเนินการตามคำขอ
Postthandle ดำเนินการหลังจากโปรเซสเซอร์ธุรกิจเสร็จสิ้นการดำเนินการตามคำขอและสร้างมุมมอง AfterCompletion ถูกเรียกหลังจาก DispatchERServlet ได้ประมวลผลคำขออย่างสมบูรณ์และสามารถใช้ในการทำความสะอาดทรัพยากรได้ ฯลฯ ดังนั้นเพื่อใช้ตรรกะการจัดการการอนุญาตของคุณเองคุณต้องรับมรดก HandlerInterceptorAdapter และเขียนสามวิธี
ก่อนอื่นให้เพิ่ม Interceptor ที่กำหนดไว้ของฉันเองลงใน SpringMVC.XML ตรรกะการใช้งานของฉัน CommonInterceptor
<!-กำหนดค่า interceptors, interceptors หลายตัวดำเนินการตามลำดับ-> <mvc: interceptors> <mvc: interceptor> <!-ตรงกับเส้นทาง URL หากคุณไม่ได้กำหนดค่าหรือ/** ตัวควบคุมทั้งหมดจะถูกสกัดกั้น-> <mvc: เส้นทางการแมป = "/ผู้ใช้/**"/> <mvc: เส้นทางการแมป = "/test/**"/> <bean> </ebean> </mvc: interceptor> interceptor ในลำดับย้อนกลับ -> </mvc: interceptors>
ตรรกะการสกัดกั้นของฉันคือ "ก่อนเข้าสู่ระบบ URL การเข้าถึงใด ๆ จะข้ามไปยังหน้าเข้าสู่ระบบหลังจากการเข้าสู่ระบบสำเร็จให้ข้ามไปยัง URL ก่อนหน้า" รหัสเฉพาะมีดังนี้:
/ ** * */ แพ็คเกจ 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 */ คลาสสาธารณะ Commoninterceptor ขยาย HandlerInterceptorAdapter {logger สุดท้าย logger สุดท้าย = loggerFactory.getLogger (CommonInterceptor.class); สตริงสุดท้ายคงที่สาธารณะ last_page = "com.alibaba.lastpage"; / * * ใช้การแมปปกติไปยังเส้นทางที่ต้องสกัดกั้นการแมปสตริงส่วนตัว; โมฆะสาธารณะ setMappingUrl (String MappingUrl) {this.mappingUrl = mappingurl; } * / / ** * เรียกก่อนที่โปรเซสเซอร์ธุรกิจจัดการคำขอ * หากถูกส่งคืน false * เรียกใช้งาน interceptors ทั้งหมด 'ftercompletion () จาก interceptor ปัจจุบันจากนั้นออกจากห่วงโซ่การสกัดกั้น * ถ้าจริง * เรียกใช้การสกัดกั้นครั้งต่อไป จากการสกัดกั้นครั้งสุดท้าย */ @Override บูลีน prehandle (คำขอ httpservletrequest, การตอบสนอง httpservletResponse, ตัวจัดการวัตถุ) โยนข้อยกเว้น {ถ้า ("get" .equalsignorecase (request.getMethod ())) } log.info ("=============== 执行顺序: 1、 prehandle =================="); string requesturi = request.getRequesturi (); String ContextPath = request.getContextPath (); string url = requesturi.substring (contextpath.length ()); log.info ("Requesturi:"+Requesturi); log.info ("ContextPath:"+ContextPath); log.info ("url:"+url); string username = (string) request.getSession (). getAttribute ("ผู้ใช้"); if (ชื่อผู้ใช้ == null) {log.info ("interceptor: ข้ามไปที่หน้าเข้าสู่ระบบ!"); request.getRequestDispatcher ("/web-inf/jsp/login.jsp"). forward (คำขอ, การตอบกลับ); กลับเท็จ; } return return true; } / *** หลังจากโปรเซสเซอร์ทางธุรกิจดำเนินการประมวลผลคำขอเสร็จสิ้นการดำเนินการดำเนินการก่อนที่มุมมองจะถูกสร้างขึ้น* คุณสามารถเพิ่มข้อมูลลงใน ModelandView เช่นเวลาปัจจุบัน* / @Override โมฆะสาธารณะ Postthandle log.info ("============================================================================================================================ log.info ("================================================================================================================ - - - การตอบสนอง, Handler Object, Exception Ex) โยนข้อยกเว้น {log.info ("============== 执行顺序: 3、 Aftercompletion ================"); หมายเหตุ: ในรหัสข้างต้นฉันเขียน requestutil ซึ่งส่วนใหญ่ใช้ฟังก์ชั่นเช่นการได้รับคำขอปัจจุบันวัตถุเซสชันการบันทึกและการเข้ารหัสหน้าและการออก
ณ จุดนี้มีการใช้งาน Interceptor และเอฟเฟกต์ดังแสดงในรูป:
ฉันจะถูกบล็อกโดยการเยี่ยมชม /ทดสอบ /สวัสดีโดยตรง
หลังจากเข้าสู่ระบบแล้วมันจะข้ามไปยังหน้าเว็บที่สอดคล้องกับ /ทดสอบ /สวัสดี
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น