ตัวดักจับ interceptor ใน SpringMVC ก็มีความสำคัญและมีประโยชน์เช่นกัน ฟังก์ชั่นหลักคือการสกัดกั้นคำขอของผู้ใช้และดำเนินการประมวลผลที่สอดคล้องกัน ตัวอย่างเช่นสามารถทำการตรวจสอบสิทธิ์หรือพิจารณาว่าผู้ใช้เข้าสู่ระบบหรือพิจารณาว่าเวลาปัจจุบันคือเวลาซื้อตั๋วเช่น 12306
1. กำหนดคลาสการใช้งาน Interceptor
การร้องขอการสกัดกั้น interceptor ใน SpringMVC จะถูกนำไปใช้ผ่าน HandlerInterceptor การกำหนด interceptor ใน SpringMVC นั้นง่ายมาก มีสองวิธีหลัก วิธีแรกคือการกำหนดคลาส interceptor ที่ใช้อินเตอร์เฟส Spring HandlerInterceptor หรือคลาสนี้สืบทอดคลาสที่ใช้อินเตอร์เฟส HandlerInterceptor เช่นคลาสนามธรรมที่ Spring ได้จัดเตรียมไว้ วิธีที่สองคือการใช้อินเทอร์เฟซ Spring WebRequestInterceptor หรือสืบทอดคลาสที่ใช้อินเตอร์เฟส WebRequestInterceptor
(i) การใช้อินเตอร์เฟส handlerInterceptor
มีสามวิธีที่กำหนดไว้ในอินเทอร์เฟซ HandlerInterceptor และเราใช้วิธีการทั้งสามนี้เพื่อสกัดกั้นคำขอของผู้ใช้
(1) คำขอ prehandle (httpservletrequest, วิธีการตอบสนอง httpservletResponse, การจัดการวัตถุ) ตามชื่อที่แสดงถึงจะถูกเรียกก่อนที่จะดำเนินการตามคำขอ Interceptor ใน SpringMVC เรียกว่าในรูปแบบโซ่ ตัวดักหลายตัวสามารถมีอยู่ในเวลาเดียวกันในแอปพลิเคชันหรือในคำขอ การโทร Interceptor แต่ละครั้งจะถูกดำเนินการตามลำดับตามลำดับการประกาศและการเรียกใช้ครั้งแรกจะถูกดำเนินการคือวิธีการ prehandle ในการสกัดกั้นดังนั้นการดำเนินการก่อนการเริ่มต้นบางอย่างสามารถดำเนินการในวิธีนี้หรือการประมวลผลล่วงหน้าของคำขอปัจจุบันหรือการตัดสินบางอย่างสามารถทำได้ในวิธีการนี้
ค่าส่งคืนของวิธีนี้เป็นบูลีนชนิดบูลีน เมื่อมันกลับไปเป็นเท็จนั่นหมายความว่าคำขอจะสิ้นสุดลงและการสกัดกั้นและคอนโทรลเลอร์ที่ตามมาจะไม่ถูกดำเนินการอีกครั้ง เมื่อค่าส่งคืนเป็นจริงวิธี prehandle ของ interceptor ถัดไปจะยังคงเรียกว่าต่อไป หากเป็นตัวดักจับสุดท้ายแล้ววิธีการควบคุมของคำขอปัจจุบันจะถูกเรียก
(2) การร้องขอ Postthandle (httpservletrequest, การตอบสนอง httpservletResponse, การจัดการวัตถุ, modelandview modelandview) วิธีการ จากคำอธิบายของวิธีการ prehandle เรารู้ว่าวิธีนี้รวมถึงวิธีการติดตามผลที่จะกล่าวถึงในภายหลังสามารถเรียกได้เมื่อค่าคืนของวิธี prehandle ของ interceptor ปัจจุบันเป็นจริง
วิธีการของ Postthandle ตามชื่อแนะนำจะถูกดำเนินการหลังจากการร้องขอปัจจุบันถูกประมวลผลนั่นคือหลังจากที่มีการเรียกวิธีการควบคุม แต่จะถูกเรียกก่อนที่ Dispatcherservlet จะส่งคืนและแสดงผลมุมมองดังนั้นเราจึงสามารถใช้งานบนวัตถุและวิววิวหลังจากกระบวนการควบคุมในวิธีนี้ ทิศทางของการเรียกของวิธีการโพสต์เทิลเป็นสิ่งที่ตรงกันข้ามกับ prehandle ซึ่งหมายความว่าวิธีการ postthandle ของ interceptor ที่ประกาศครั้งแรกจะถูกดำเนินการในภายหลังซึ่งค่อนข้างคล้ายกับกระบวนการดำเนินการของ interceptor ใน struts2 กระบวนการดำเนินการของ interceptor ใน struts2 นั้นถูกล่ามโซ่ แต่ใน struts2 วิธีการเรียกใช้การกระทำของ ActionInvocation จะต้องได้รับการเรียกด้วยตนเองเพื่อเรียกใช้การเรียกไปยังการดักจับหรือการกระทำครั้งต่อไป จากนั้นเนื้อหาในแต่ละ interceptor ก่อนที่วิธีการเรียกใช้จะถูกดำเนินการในคำสั่งที่ประกาศและเนื้อหาหลังจากวิธีการเรียกใช้กลับมา
(3) fterncompletion (คำขอ httpservletrequest, การตอบสนอง httpservletResponse, การจัดการวัตถุ, ข้อยกเว้น Ex) วิธีการนี้จะต้องดำเนินการเมื่อค่าส่งคืนของวิธี prehandle ของ Interceptor ที่สอดคล้องกันในปัจจุบันเป็นจริง ตามชื่อแนะนำวิธีนี้จะถูกดำเนินการหลังจากคำขอทั้งหมดเสร็จสมบูรณ์นั่นคือหลังจาก DispatchERServlet แสดงมุมมองที่เกี่ยวข้อง ฟังก์ชั่นหลักของวิธีนี้คือการทำความสะอาดทรัพยากร
นี่คือคำอธิบายรหัสง่าย ๆ :
นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า org.springframework.web.servlet.handlerinterceptor; นำเข้า org.springframework.web.servlet.modelandview; Public Class SpringMvCinterceptor ใช้ HandlerInterceptor { /*** วิธีการ prehandle ใช้สำหรับการสกัดกั้นโปรเซสเซอร์ ตามชื่อแนะนำวิธีนี้จะถูกเรียกก่อนกระบวนการควบคุม Interceptor interceptor ใน SpringMVC ถูกล่ามโซ่และตัวดักหลายตัวสามารถมีอยู่ในเวลาเดียวกัน จากนั้น SpringMVC จะดำเนินการทีละหนึ่งตามคำสั่งของการประกาศและวิธีการ prehandle ทั้งหมดใน interceptor จะถูกเรียกก่อนที่วิธีการควบคุมจะถูกเรียก โครงสร้างห่วงโซ่การสกัดกั้นของ SpringMVC สามารถขัดจังหวะได้ วิธีการขัดจังหวะนี้ทำให้ค่าการส่งคืนของ prehandle เป็นเท็จ เมื่อค่าส่งคืนของ prehandle เป็นเท็จคำขอทั้งหมดจะสิ้นสุดลง */ @Override Public Boolean Prehandle (คำขอ httpservletRequest, การตอบกลับ httpservletResponse, handler object) โยนข้อยกเว้น {// วิธีการที่สร้างขึ้นอัตโนมัติ todo stub return false; } /*** วิธีนี้จะถูกดำเนินการเฉพาะเมื่อค่าส่งคืนปัจจุบันของวิธี prehandle ของ interceptor เป็นจริง Postthandle ใช้สำหรับการสกัดกั้นโปรเซสเซอร์ เวลาดำเนินการของมันคือหลังจากประมวลผลโปรเซสเซอร์*นั่นคือหลังจากวิธีการควบคุมถูกเรียก แต่มันจะถูกดำเนินการก่อนที่ dispatcherservlet จะแสดงมุมมองซึ่งหมายความว่าในวิธีนี้คุณสามารถใช้งาน ModelandView* โครงสร้างโซ่ของวิธีนี้เป็นสิ่งที่ตรงกันข้ามกับทิศทางการเข้าถึงปกตินั่นคือวิธีที่ประกาศก่อนจะถูกเรียกในภายหลัง สิ่งนี้คล้ายกับกระบวนการดำเนินการของตัวดักใน struts2 * เฉพาะในวิธีการสกัดกั้นใน struts2 วิธีการเรียกใช้ actioninvocation ควรเรียกด้วยตนเอง วิธีการของ ActionInvocation ใน struts2 คือการเรียก Interceptor * หรือเรียกการกระทำและจากนั้นเนื้อหาที่จำเป็นต้องเรียกก่อนที่จะเขียน Interceptor ก่อนที่จะเรียกร้องให้เรียกใช้และเนื้อหาที่ต้องเรียกหลังจากที่ interceptor เขียนขึ้นหลังจากการเรียกใช้วิธีการเรียกใช้ * / @Override โมฆะสาธารณะ Postthandle (คำขอ httpservletRequest, การตอบสนอง httpservletResponse, ตัวจัดการวัตถุ, modelandview modelandview) โยนข้อยกเว้น {// วิธีการที่สร้างขึ้นอัตโนมัติวิธีการที่เกิดขึ้นจริง} / *** วิธีนี้จะถูกดำเนินการหลังจากคำขอทั้งหมดเสร็จสมบูรณ์นั่นคือ DispatchERServlet จะแสดงการดำเนินการดู * ฟังก์ชั่นหลักของวิธีนี้คือการทำความสะอาดทรัพยากร แน่นอนว่าวิธีนี้สามารถดำเนินการได้เฉพาะเมื่อค่าส่งคืนปัจจุบันของวิธี prehandle ของ interceptor เป็นจริง */ @Override โมฆะสาธารณะ fterncompletion (คำขอ httpservletrequest, การตอบสนอง httpservletResponse, ตัวจัดการวัตถุ, Exception Ex) โยนข้อยกเว้น {// วิธีการที่สร้างอัตโนมัติ stub}}}}} (ii) ใช้อินเตอร์เฟส WebRequestInterceptor
นอกจากนี้ยังมีสามวิธีที่กำหนดไว้ใน WebRequestInterceptor และเรายังใช้วิธีการทั้งสามนี้เพื่อใช้การสกัดกั้น ทั้งสามวิธีผ่านพารามิเตอร์เดียวกัน WebRequest ดังนั้น WebRequest นี้คืออะไร? WebRequest นี้เป็นอินเทอร์เฟซที่กำหนดโดยฤดูใบไม้ผลิ คำจำกัดความของวิธีการในนั้นโดยทั่วไปเหมือนกับ httpservletrequest การดำเนินการทั้งหมดที่ดำเนินการบน WebRequestInterceptor ใน WebRequestInterceptor จะถูกซิงโครไนซ์กับ httpservletRequest จากนั้นผ่านในคำขอปัจจุบัน
(1) วิธีการ prehandle (คำขอ WebRequest) วิธีนี้จะถูกเรียกก่อนที่คำขอจะถูกประมวลผลนั่นคือมันจะถูกเรียกก่อนที่จะมีการเรียกวิธีการควบคุม วิธีนี้แตกต่างจาก prehandle ใน handlerinterceptor ความแตกต่างที่สำคัญคือค่าส่งคืนของวิธีการเป็นโมฆะซึ่งหมายความว่าไม่มีค่าส่งคืน ดังนั้นโดยทั่วไปเราใช้มันเพื่อเตรียมทรัพยากร ตัวอย่างเช่นเมื่อเราใช้ไฮเบอร์เนตเราสามารถเตรียมวัตถุเซสชันไฮเบอร์เนตในวิธีนี้จากนั้นใช้ setAttribute (ชื่อ, ค่า, ขอบเขต) ของ WebRequest เพื่อนำไปไว้ในคุณสมบัติ WebRequest ที่นี่เราสามารถพูดคุยเกี่ยวกับขอบเขตพารามิเตอร์ที่สามของวิธี setAttribute ซึ่งเป็นประเภทจำนวนเต็ม มีการกำหนดค่าคงที่สามค่าสำหรับการร้องขออินเทอร์เฟซเลเยอร์หลักของ WebRequest: requestattributes:
scope_request: ค่าของมันคือ 0 ซึ่งหมายความว่าสามารถเข้าถึงได้ตามคำขอเท่านั้น
SCOPE_SESSION: ค่าของมันคือ 1 ถ้าสภาพแวดล้อมอนุญาตมันจะแสดงถึงเซสชันที่แยกได้ในท้องถิ่นมิฉะนั้นจะแสดงถึงเซสชันปกติและสามารถเข้าถึงได้ภายในขอบเขตของเซสชัน
SCOPE_GLOBAL_SESSION: ค่าของมันคือ 2. ถ้าสภาพแวดล้อมอนุญาตมันแสดงถึงเซสชันที่ใช้ร่วมกันทั่วโลกมิฉะนั้นจะแสดงถึงเซสชันปกติและสามารถเข้าถึงได้ภายในขอบเขตของเซสชัน
(2) Postthandle (คำขอ WebRequest, ModelMap Model) วิธีนี้จะถูกเรียกหลังจากการประมวลผลคำขอนั่นคือหลังจากวิธีการควบคุมถูกเรียก แต่จะถูกเรียกก่อนที่จะส่งคืนมุมมองเพื่อให้คุณสามารถเปลี่ยนการแสดงข้อมูลโดยการเปลี่ยนโมเดลโมเดลข้อมูลในวิธีนี้ วิธีนี้มีพารามิเตอร์สองตัว วัตถุ WebRequest ใช้เพื่อส่งข้อมูลคำขอทั้งหมด ตัวอย่างเช่นข้อมูลที่เตรียมไว้ใน prehandle สามารถส่งผ่านและเข้าถึงผ่าน WebRequest; ModelMap เป็นวัตถุโมเดลที่ส่งคืนหลังจากกระบวนการคอนโทรลเลอร์ เราสามารถเปลี่ยนโมเดลโมเดลที่ส่งคืนได้โดยการเปลี่ยนคุณสมบัติ
(3) Aftercompletion (คำขอ WebRequest, Exception Ex) วิธีการ วิธีนี้จะถูกดำเนินการหลังจากดำเนินการตามคำขอทั้งหมดนั่นคือหลังจากมุมมองถูกส่งคืนและแสดงผล ดังนั้นในวิธีนี้การดำเนินการปล่อยทรัพยากรสามารถทำได้ พารามิเตอร์ WebRequest สามารถผ่านทรัพยากรที่เราเตรียมไว้ใน prehandle ที่นี่เพื่อวางจำหน่าย พารามิเตอร์ข้อยกเว้นแสดงถึงวัตถุข้อยกเว้นที่ร้องขอในปัจจุบัน หากข้อยกเว้นที่ถูกโยนลงในคอนโทรลเลอร์ได้รับการประมวลผลโดยโปรเซสเซอร์สปริงข้อยกเว้นวัตถุข้อยกเว้นจะเป็นโมฆะ
นี่คือคำอธิบายรหัสง่าย ๆ :
นำเข้า org.springframework.ui.modelmap; นำเข้า org.springframework.web.context.request.webrequest; นำเข้า org.springframework.web.context.request.webrequestinterceptor; คลาสสาธารณะ AllInterceptor ใช้ WebRequestInterceptor { /*** ดำเนินการก่อนที่จะดำเนินการตามคำขอ วิธีนี้ใช้เป็นหลักในการเตรียมข้อมูลทรัพยากรและจากนั้นพวกเขาสามารถนำไปใช้ใน webrequest เป็นแอตทริบิวต์คำขอ*/ @Override โมฆะสาธารณะ prehandle (คำขอ webrequest) โยนข้อยกเว้น {// todo วิธีการที่สร้างอัตโนมัติ request.setAttribute ("คำขอ", "คำขอ", webrequest.scope_request); // สิ่งนี้อยู่ในขอบเขตของคำขอดังนั้นคุณจะได้รับ request.setAttribute ("เซสชัน", "เซสชัน" ในคำขอในคำขอปัจจุบัน หากสภาพแวดล้อมอนุญาตให้สามารถเข้าถึงได้ในเซสชั่นที่แยกได้ในพื้นที่เท่านั้น มิฉะนั้นสามารถเข้าถึงได้ในเซสชันปัจจุบันปกติ request.setAttribute ("globalsession", "globalsession", webrequest.scope_global_session); // ถ้าสภาพแวดล้อมอนุญาตมันสามารถเข้าถึงได้ในเซสชั่นที่ใช้ร่วมกันทั่วโลกมิฉะนั้นจะสามารถเข้าถึงได้ในเซสชั่นปัจจุบันปกติ}/*** ModelMap แสดงถึงวัตถุโมเดลที่ส่งคืนหลังจากคอนโทรลเลอร์ถูกร้องขอให้ประมวลผลคอนโทรลเลอร์ดังนั้นคุณสมบัติของ ModelMap สามารถแก้ไขได้ในวิธีนี้เพื่อให้ได้ผลของการเปลี่ยนโมเดลที่ส่งคืน */ @Override โมฆะสาธารณะ Postthandle (คำขอ WebRequest, ModelMap Map) พ่นข้อยกเว้น {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stub สำหรับ (คีย์สตริง: map.keyset ()) system.out.println (คีย์ + - Aftercompletion (คำขอ WebRequest, Exception Exception) โยนข้อยกเว้น {// todo วิธีการที่สร้างอัตโนมัติระบบ Stub System.out.println (ข้อยกเว้น + - - -2. เพิ่มคลาส Interceptor ที่กำหนดไว้ในระบบสกัดกั้นของ SpringMVC
1. เพิ่มสคีมาที่รองรับ MVC ในไฟล์กำหนดค่า SpringMVC
xmlns: mvc = "http://www.springframework.org/schema/mvc" xsi: schemalocation = "http://www.springframework.org/schema/mvcc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd "
นี่คือตัวอย่างของคำสั่งของฉัน:
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance xmlns: mvc = "http://www.springframework.org/schema/mvc" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd ">
ด้วยวิธีนี้คุณสามารถใช้แท็ก MVC ในไฟล์การกำหนดค่า SpringMVC มี MVC: interceptors ในแท็ก MVC ที่ใช้ในการประกาศตัวดักจับของ SpringMVC
(ii) ใช้ MVC: แท็ก interceptor
<MVC: interceptors> <!- ใช้ถั่วเพื่อกำหนดตัวดักจับ ตัวดักที่กำหนดโดยตรงภายใต้รูทของ MVC: interceptors จะสกัดกั้นคำขอทั้งหมด-> <bean/> <mvc: interceptor> <mvc: เส้นทางการทำแผนที่ = "/test/number.do"/> <!-การเป็นตัวแทนที่กำหนดภายใต้ MVC: interceptor
จากตัวอย่างข้างต้นเราจะเห็นว่าชุดของตัวดักจับสามารถประกาศได้โดยใช้แท็ก MVC: Interceptors จากนั้นพวกเขาสามารถสร้างห่วงโซ่การดักจับ คำสั่งการดำเนินการของ interceptor ดำเนินการตามคำสั่งของการประกาศ วิธีการ prehandle ใน interceptor ที่ประกาศจะถูกดำเนินการก่อน แต่วิธีการ postthandle และวิธีการ ampletion จะถูกดำเนินการในภายหลัง
มีสองวิธีหลักในการประกาศ Interceptor ภายใต้ MVC: Interceptors Tag:
(1) กำหนดวัตถุถั่วโดยตรงของคลาสการใช้งาน Interceptor Interceptor Interceptor ที่ประกาศด้วยวิธีนี้จะสกัดกั้นการร้องขอทั้งหมด
(2) ใช้ MVC: แท็ก interceptor เพื่อประกาศ Interceptor ที่ประกาศด้วยวิธีนี้สามารถกำหนดเส้นทางการร้องขอที่ต้องสกัดกั้นผ่าน MVC: การแมปย่อย
หลังจากสองขั้นตอนข้างต้นตัวดักจับที่กำหนดจะทำหน้าที่เพื่อสกัดกั้นคำขอเฉพาะ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น