จาก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 โดยทั่วไปจะแสดงเมื่อต้องการแมปตัวกรองกับเนื้อหาบางประเภท (เช่นรูปภาพ) หรือกับคำขอทั้งหมด