Perbedaan antara Interceptor dan Filter di Spring MVC

108

Saya sedikit bingung tentang Filterdan Interceptortujuannya.

Seperti yang saya pahami dari dokumen, Interceptordijalankan di antara permintaan. Di sisi lain Filterdijalankan sebelum rendering view, tetapi setelah Controller memberikan respon.

Jadi di mana perbedaan antara postHandle()di Interceptor dan doFilter()di Filter?

Tema MVC musim semi Apa praktik terbaik yang harus digunakan dalam kasus penggunaan? Dalam gambar ini di mana karya-karya Filterdan Interceptors?

rpieniazek.dll
sumber

Jawaban:

87

Dari HandlerIntercepter's javadoc :

HandlerInterceptorpada 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 HandlerInterceptordalam konteks aplikasi.

Sebagai pedoman dasar, tugas pra-pemrosesan terkait penangan yang sangat detail adalah kandidat untuk HandlerInterceptorimplementasi, terutama kode penangan umum yang difaktorkan keluar dan pemeriksaan otorisasi. Di sisi lain, a Filtercocok 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()?

postHandleakan dipanggil setelah pemanggilan metode penangan tetapi sebelum tampilan dirender. Jadi, Anda bisa menambahkan lebih banyak objek model ke tampilan tapi Anda tidak bisa mengubahnya HttpServletResponsekarena sudah dilakukan.

doFilterjauh lebih serbaguna daripada postHandle. Anda dapat mengubah permintaan atau tanggapan dan meneruskannya ke rantai atau bahkan memblokir pemrosesan permintaan.

Selain itu, dalam preHandledan postHandlemetode, Anda memiliki akses ke HandlerMethodyang 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 HandlerInterceptorimplementasi, terutama kode penangan umum yang difaktorkan keluar dan pemeriksaan otorisasi. Di sisi lain, a Filtercocok 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.

Ali Dehghani
sumber
Perhatikan bahwa filter dikonfigurasi di web.xml, HandlerInterceptor dalam konteks aplikasi ??? bisakah kamu menjelaskannya?
4
Filter terkait dengan Servlet API dan HandlerInterceptermerupakan konsep khusus Spring. Untuk mendaftarkan filter servlet, Anda dapat mendaftarkannya menggunakan yang lama web.xml(Servlet 2.5 dan versi yang lebih lama) atau pendekatan programatik baru (Servlet 3+). Karena HandlerIntercepterini hanyalah abstraksi Musim Semi, Anda harus mendaftar dalam konteks Musim Semi
Ali Dehghani
Filter terkait dengan Servlet API dan HandlerIntercepter adalah konsep khusus Spring. coorect! tetapi apa pun yang Anda daftarkan oleh web.xml adalah bagian WebApplicationyang tunggal per dispatcher, jadi servlet dan filter keduanya terkait dengan konteks, itu adalah praktik yang baik untuk mengasosiasikan interseptor dan filter dengan rootContextjadi jika Anda memiliki beberapa dispatcher semua dapat berbagi sama.
9

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.

Manas
sumber
2
sumber: mkjava.com/tutorial/filter-vs-interceptor harus menyebutkan sumber
Premraj
bagaimana dengan filter keamanan Spring, ini memberi Anda konteks pegas juga.
Lovin
6

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

Satyam
sumber
2
Tautan rusak.
Jason Law