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