ความแตกต่างระหว่าง Interceptor และ Filter ใน Spring MVC


114

ฉันสับสนเล็กน้อยเกี่ยวกับFilterและInterceptorวัตถุประสงค์

ตามที่ฉันเข้าใจจากเอกสารInterceptorจะเรียกใช้ระหว่างคำขอ ในทางกลับกันFilterจะถูกเรียกใช้ก่อนการแสดงผลมุมมอง แต่หลังจากคอนโทรลเลอร์แสดงการตอบสนอง

แล้วpostHandle()Interceptor กับdoFilter()ใน Filter ต่างกันตรงไหน?

ฤดูใบไม้ผลิ MVC sheme แนวทางปฏิบัติที่ดีที่สุดในกรณีใดที่ควรใช้คืออะไร? ในภาพนี้ที่งานFilterและInterceptorS?

คำตอบ:


91

จากHandlerIntercepter's Javadoc :

HandlerInterceptorโดยพื้นฐานแล้วจะคล้ายกับ Servlet Filterแต่ในทางกลับกันมันอนุญาตให้มีการประมวลผลล่วงหน้าแบบกำหนดเองโดยมีตัวเลือกในการห้ามการดำเนินการของตัวจัดการเองและการประมวลผลภายหลังแบบกำหนดเอง ตัวกรองมีประสิทธิภาพมากกว่าเช่นอนุญาตให้แลกเปลี่ยนคำขอและอ็อบเจ็กต์การตอบสนองที่ส่งต่อมา โปรดทราบว่าตัวกรองที่ได้รับการกำหนดค่าในweb.xmlการ HandlerInterceptorในบริบทแอพลิเคชัน

ตามแนวทางพื้นฐานงานก่อนการประมวลผลที่เกี่ยวข้องกับตัวจัดการแบบละเอียดเป็นตัวเลือกสำหรับHandlerInterceptorการนำไปใช้งานโดยเฉพาะรหัสตัวจัดการทั่วไปที่แยกตัวประกอบและการตรวจสอบการอนุญาต ในทางกลับกัน a Filterเหมาะอย่างยิ่งสำหรับเนื้อหาที่ร้องขอและดูการจัดการเนื้อหาเช่นรูปแบบหลายส่วนและการบีบอัด GZIP โดยทั่วไปจะแสดงเมื่อต้องการแมปตัวกรองกับเนื้อหาบางประเภท (เช่นรูปภาพ) หรือกับคำขอทั้งหมด

ด้วยการกล่าวว่า:

แล้วความแตกต่างระหว่างInterceptor#postHandle()และ Filter#doFilter()อย่างไร?

postHandleจะถูกเรียกหลังจากการเรียกใช้เมธอดตัวจัดการ แต่ก่อนที่จะแสดงมุมมอง ดังนั้นคุณสามารถเพิ่มโมเดลออบเจ็กต์เพิ่มเติมในมุมมองได้ แต่คุณไม่สามารถเปลี่ยนอ็อบเจกต์ได้HttpServletResponseเนื่องจากมีการคอมมิตแล้ว

doFilterมีความหลากหลายมากกว่าไฟล์postHandle. คุณสามารถเปลี่ยนคำขอหรือการตอบกลับและส่งต่อไปยังเชนหรือแม้กระทั่งบล็อกการประมวลผลคำขอ

นอกจากนี้ในpreHandleและpostHandleวิธีการคุณสามารถเข้าถึงHandlerMethodที่ดำเนินการตามคำขอ ดังนั้นคุณสามารถเพิ่มตรรกะก่อน / หลังการประมวลผลตามตัวจัดการเอง ตัวอย่างเช่นคุณสามารถเพิ่มตรรกะสำหรับวิธีการจัดการที่มีคำอธิบายประกอบบางส่วนได้

แนวทางปฏิบัติที่ดีที่สุดในกรณีใดที่ควรใช้คืออะไร?

ตามที่เอกสารกล่าวไว้งานก่อนการประมวลผลที่เกี่ยวข้องกับตัวจัดการที่ละเอียดอ่อนเป็นตัวเลือกสำหรับHandlerInterceptorการใช้งานโดยเฉพาะอย่างยิ่งรหัสตัวจัดการทั่วไปที่แยกตัวประกอบและการตรวจสอบการอนุญาต ในทางกลับกัน a Filterเหมาะอย่างยิ่งสำหรับเนื้อหาที่ร้องขอและดูการจัดการเนื้อหาเช่นรูปแบบหลายส่วนและการบีบอัด GZIP โดยทั่วไปจะแสดงเมื่อต้องการแมปตัวกรองกับเนื้อหาบางประเภท (เช่นรูปภาพ) หรือกับคำขอทั้งหมด


โปรดทราบว่าตัวกรองได้รับการกำหนดค่าใน web.xml ซึ่งเป็น HandlerInterceptor ในบริบทของแอปพลิเคชัน ??? คุณช่วยอธิบายได้ไหม

5
ตัวกรองเกี่ยวข้องกับ Servlet API และHandlerIntercepterเป็นแนวคิดเฉพาะของ Spring ในการลงทะเบียนตัวกรอง servlet คุณสามารถลงทะเบียนโดยใช้web.xmlเวอร์ชันเก่า(Servlet 2.5 และเวอร์ชันเก่ากว่า) หรือวิธีการแบบเป็นโปรแกรมใหม่ (Servlet 3+) เนื่องจากสิ่งHandlerIntercepterนี้เป็นเพียงสิ่งที่เป็นนามธรรมของฤดูใบไม้ผลิคุณควรลงทะเบียนในบริบทของฤดูใบไม้ผลิ
Ali Dehghani

ตัวกรองเกี่ยวข้องกับ Servlet API และ HandlerIntercepter เป็นแนวคิดเฉพาะของ Spring คอเรค! แต่สิ่งที่คุณลงทะเบียนโดย web.xml เป็นส่วนหนึ่งWebApplicationซึ่งเป็นรายการเดียวต่อผู้มอบหมายงานดังนั้น servlet และตัวกรองทั้งสองจะเชื่อมโยงกับบริบทจึงเป็นแนวทางปฏิบัติที่ดีในการเชื่อมโยงตัวสกัดกั้นและตัวกรองด้วยrootContextดังนั้นหาก u hv ผู้มอบหมายงานหลายคนสามารถแบ่งปันสิ่งเดียวกันได้

11

ตัวกรอง : - ตัวกรองตามชื่อที่แนะนำคือคลาส Java ที่เรียกใช้โดยคอนเทนเนอร์ servlet สำหรับแต่ละคำขอ HTTP ที่เข้ามาและสำหรับการตอบสนอง http แต่ละรายการ ด้วยวิธีนี้เป็นไปได้ในการจัดการคำร้องขอขาเข้า HTTP ก่อนที่จะไปถึงรีซอร์สเช่นเพจ JSP, servlet หรือเพจแบบคงที่ ในทำนองเดียวกันสามารถจัดการการตอบกลับ HTTP ขาออกหลังจากการเรียกใช้ทรัพยากร

Interceptor : - Spring Interceptors คล้ายกับ Servlet Filters แต่ทำหน้าที่ใน Spring Context จึงมีประสิทธิภาพมากมายในการจัดการคำขอและการตอบกลับ HTTP แต่สามารถใช้พฤติกรรมที่ซับซ้อนกว่าได้เนื่องจากสามารถเข้าถึงบริบท Spring ทั้งหมดได้


2
source: mkjava.com/tutorial/filter-vs-interceptorต้องพูดถึงแหล่งข่าว
เปรมราช

สิ่งที่เกี่ยวกับตัวกรองความปลอดภัยของสปริงมันให้บริบทของฤดูใบไม้ผลิด้วย
Lovin

6

HandlerInterceptor ให้การควบคุมที่ละเอียดกว่าตัวกรองเนื่องจากคุณสามารถเข้าถึง "ตัวจัดการ" เป้าหมายที่แท้จริงซึ่งหมายความว่าการดำเนินการใด ๆ ที่คุณดำเนินการอาจแตกต่างกันไปขึ้นอยู่กับสิ่งที่คำขอกำลังทำอยู่ (ในขณะที่ตัวกรอง servlet จะถูกนำไปใช้โดยทั่วไป สำหรับคำขอทั้งหมด - สามารถพิจารณาพารามิเตอร์ของแต่ละคำขอเท่านั้น) นอกจากนี้ handlerInterceptor ยังมีวิธีการที่แตกต่างกัน 3 วิธีเพื่อให้คุณสามารถใช้พฤติกรรมก่อนที่จะเรียกตัวจัดการหลังจากที่ตัวจัดการดำเนินการเสร็จสิ้น แต่ก่อนที่จะดูการเรนเดอร์ (ซึ่งคุณสามารถข้ามการแสดงผลมุมมองได้ทั้งหมด) หรือหลังจากที่มุมมองได้รับการแสดงผล นอกจากนี้คุณยังสามารถตั้งค่าตัวสกัดกั้นที่แตกต่างกันสำหรับกลุ่มของตัวจัดการที่แตกต่างกัน - ตัวดักจับได้รับการกำหนดค่าบน handlerMapping และอาจมีตัวจัดการหลายตัว

ดังนั้นหากคุณมีความจำเป็นที่จะต้องทำบางสิ่งทั่วไปอย่างสมบูรณ์ (เช่นบันทึกคำขอทั้งหมด) ตัวกรองก็เพียงพอแล้ว แต่ถ้าพฤติกรรมขึ้นอยู่กับตัวจัดการเป้าหมายหรือคุณต้องการทำบางสิ่งระหว่างการจัดการคำขอและการแสดงผลการดู HandlerInterceptor ให้ความยืดหยุ่นนั้น

อ้างอิง: http://static.springframework.org/sp...ng-interceptor


2
ลิงก์เสีย
Jason Law
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.