Dari HandlerIntercepter
's javadoc :
HandlerInterceptor
pada dasarnya mirip dengan Servlet Filter
, tetapi berbeda dengan Servlet , ia hanya mengizinkan pra-pemrosesan kustom dengan opsi untuk melarang eksekusi penangan itu sendiri, dan pasca-pemrosesan kustom. Filter lebih kuat, misalnya memungkinkan untuk menukar objek permintaan dan respons yang diturunkan rantai. Perhatikan bahwa filter dikonfigurasi dalam web.xml
, a
HandlerInterceptor
dalam konteks aplikasi.
Sebagai pedoman dasar, tugas pra-pemrosesan terkait penangan yang sangat detail adalah kandidat untuk HandlerInterceptor
implementasi, terutama kode penangan umum yang difaktorkan keluar dan pemeriksaan otorisasi. Di sisi lain, a Filter
cocok untuk konten permintaan dan penanganan konten tampilan, seperti formulir multi-bagian dan kompresi GZIP. Ini biasanya menunjukkan ketika seseorang perlu memetakan filter ke tipe konten tertentu (misalnya gambar), atau ke semua permintaan.
Dengan itu dikatakan:
Jadi di manakah perbedaan antara Interceptor#postHandle()
dan
Filter#doFilter()
?
postHandle
akan dipanggil setelah pemanggilan metode penangan tetapi sebelum tampilan dirender. Jadi, Anda bisa menambahkan lebih banyak objek model ke tampilan tapi Anda tidak bisa mengubahnya HttpServletResponse
karena sudah dilakukan.
doFilter
jauh lebih serbaguna daripada postHandle
. Anda dapat mengubah permintaan atau tanggapan dan meneruskannya ke rantai atau bahkan memblokir pemrosesan permintaan.
Selain itu, dalam preHandle
dan postHandle
metode, Anda memiliki akses ke HandlerMethod
yang memproses permintaan. Jadi, Anda dapat menambahkan logika pra / pasca-pemrosesan berdasarkan penangan itu sendiri. Misalnya, Anda dapat menambahkan logika untuk metode penangan yang memiliki beberapa anotasi.
Apa praktik terbaik yang harus digunakan dalam kasus penggunaan?
Seperti yang dikatakan dokumen, tugas pra-pemrosesan terkait penangan yang sangat detail adalah kandidat untuk HandlerInterceptor
implementasi, terutama kode penangan umum yang difaktorkan keluar dan pemeriksaan otorisasi. Di sisi lain, a Filter
cocok untuk konten permintaan dan penanganan konten tampilan, seperti formulir multi-bagian dan kompresi GZIP. Ini biasanya menunjukkan ketika seseorang perlu memetakan filter ke tipe konten tertentu (misalnya gambar), atau ke semua permintaan.
HandlerIntercepter
merupakan konsep khusus Spring. Untuk mendaftarkan filter servlet, Anda dapat mendaftarkannya menggunakan yang lamaweb.xml
(Servlet 2.5 dan versi yang lebih lama) atau pendekatan programatik baru (Servlet 3+). KarenaHandlerIntercepter
ini hanyalah abstraksi Musim Semi, Anda harus mendaftar dalam konteks Musim SemiWebApplication
yang tunggal per dispatcher, jadi servlet dan filter keduanya terkait dengan konteks, itu adalah praktik yang baik untuk mengasosiasikan interseptor dan filter denganrootContext
jadi jika Anda memiliki beberapa dispatcher semua dapat berbagi sama.Filter : - Filter seperti namanya adalah kelas Java yang dijalankan oleh kontainer servlet untuk setiap permintaan HTTP yang masuk dan untuk setiap respons http. Dengan cara ini, dimungkinkan untuk mengelola permintaan masuk HTTP sebelum mereka mencapai sumber daya, seperti halaman JSP, servlet atau halaman statis sederhana; dengan cara yang sama dimungkinkan untuk mengelola respons keluar HTTP setelah eksekusi sumber daya.
Interceptor : - Spring Interceptors mirip dengan Servlet Filters tetapi mereka bertindak dalam Konteks Spring sehingga sangat kuat untuk mengelola Permintaan dan Respon HTTP tetapi mereka dapat menerapkan perilaku yang lebih canggih karena dapat mengakses semua konteks Spring.
sumber
HandlerInterceptor memberi Anda kontrol yang lebih cermat daripada filter, karena Anda memiliki akses ke "handler" target sebenarnya - ini berarti bahwa tindakan apa pun yang Anda lakukan dapat bervariasi bergantung pada apa yang sebenarnya dilakukan oleh permintaan (sedangkan filter servlet diterapkan secara umum untuk semua permintaan - hanya dapat memperhitungkan parameter setiap permintaan). HandlerInterceptor juga menyediakan 3 metode berbeda, sehingga Anda dapat menerapkan perilaku sebelum memanggil penangan, setelah penangan selesai tetapi sebelum menampilkan rendering (di mana Anda bahkan dapat mengabaikan rendering tampilan sama sekali), atau setelah tampilan itu sendiri telah dirender. Selain itu, Anda bisa menyiapkan interseptor berbeda untuk grup penangan yang berbeda - interseptor dikonfigurasikan di handlerMapping, dan mungkin ada beberapa handlerMappings.
Oleh karena itu, jika Anda memiliki kebutuhan untuk melakukan sesuatu yang benar-benar generik (misalnya mencatat semua permintaan), maka filter sudah cukup - tetapi jika perilakunya bergantung pada penangan target atau Anda ingin melakukan sesuatu antara penanganan permintaan dan tampilan rendering, maka HandlerInterceptor menyediakan fleksibilitas itu.
Referensi: http://static.springframework.org/sp...ng-interceptor
sumber