Apa Itu Filter?
Filter adalah fitur standar spesifikasi J2EE yang memungkinkan pemrosesan tugas tambahan untuk semua permintaan yang sesuai dengan pola URL, sebelum dan sesudah permintaan tersebut diteruskan ke Dispatcher Servlet. Dengan kata lain, filter dikelola oleh web container seperti Tomcat, bukan Spring container, sehingga memproses permintaan sebelum mencapai Dispatcher Servlet.
Implementasi Filter
Untuk menambahkan filter, Anda perlu mengimplementasikan antarmuka Filter dari javax.servlet, yang memiliki tiga metode berikut:
- Metode init
- Metode ini digunakan untuk menginisialisasi objek filter dan menambahkannya ke layanan. Web container akan memanggil metode init satu kali untuk menginisialisasi objek filter, dan permintaan selanjutnya akan diproses melalui metode doFilter().
- Metode doFilter
- Metode ini dijalankan oleh web container sebelum setiap permintaan HTTP yang sesuai dengan pola URL diteruskan ke Dispatcher Servlet, dan juga sebelum Dispatcher Servlet mengirimkan respons HTTP ke klien.
Parameter untuk doFilter() adalah FilterChain, yang memungkinkan Anda meneruskan permintaan ke target berikutnya dengan memanggil doFilter() dari FilterChain. Dengan menempatkan proses yang Anda butuhkan sebelum dan sesudah chain.doFilter(), Anda dapat menjalankan pemrosesan yang diinginkan.
- Metode ini dijalankan oleh web container sebelum setiap permintaan HTTP yang sesuai dengan pola URL diteruskan ke Dispatcher Servlet, dan juga sebelum Dispatcher Servlet mengirimkan respons HTTP ke klien.
- Metode destroy
- Metode ini digunakan untuk menghapus objek filter dari layanan dan mengembalikan sumber daya yang digunakan. Metode ini dipanggil satu kali oleh web container, dan setelah itu, objek filter tidak lagi diproses melalui doFilter().
Contoh Kode - Spesifikasi Servlet
Contoh Kode - @Component
- @Component: Filter dapat didaftarkan sebagai Spring bean.
- @Order: Dapat digunakan untuk menentukan urutan filter jika ada beberapa filter.
- Jika filter yang sesuai dengan spesifikasi servlet didaftarkan sebagai Spring bean seperti ini, Anda dapat menggunakan bean Spring lainnya yang sesuai dengan spesifikasi Spring.
Contoh Kode - @Configuration
Jika Anda ingin filter hanya berjalan untuk URI tertentu, Anda dapat mendaftarkan filter sebagai Spring bean menggunakan FilterRegistrationBean.
Kegunaan Filter
Filter umumnya bertanggung jawab untuk memvalidasi dan memproses parameter permintaan itu sendiri.
- Tugas Umum yang Berkaitan dengan Keamanan
- Karena filter berjalan di web container, Anda dapat melakukan pemeriksaan keamanan (seperti pencegahan XSS dan CSRF) dan memblokir permintaan yang tidak valid. Karena pemblokiran terjadi sebelum permintaan mencapai Spring container, keamanan aplikasi dapat ditingkatkan.
- Pencatatan untuk Semua Permintaan
- Kompresi Gambar/Data dan Pengkodean Karakter
- Filter telah mengimplementasikan fitur yang digunakan secara umum dalam aplikasi web, seperti kompresi gambar atau data dan pengkodean karakter.
- Kustomisasi ServletRequest
- HttpServletRequest hanya dapat membaca isi Body sekali. Oleh karena itu, Filter atau Interceptor tidak dapat membaca Body. Anda dapat membuat ServletRequest khusus untuk mencatat isi Body.
Interceptor
Apa Itu Interceptor?
Berbeda dengan filter (Filter) yang merupakan standar spesifikasi J2EE, Interceptor adalah teknologi yang disediakan oleh Spring. Interceptor memungkinkan Anda untuk mengakses atau memodifikasi permintaan dan respons sebelum dan sesudah Dispatcher Servlet memanggil controller. Dengan kata lain, Interceptor bekerja dalam konteks Spring, berbeda dengan filter yang bekerja di web container.
Dispatcher Servlet meminta pemetaan handler untuk menemukan controller yang sesuai, dan mengembalikan HandlerExecutionChain sebagai hasilnya. Jika ada satu atau lebih interceptor yang didaftarkan dalam HandlerExecutionChain ini, interceptor akan dijalankan secara berurutan sebelum controller dijalankan. Jika tidak ada interceptor, controller akan langsung dijalankan.
Implementasi Interceptor
Untuk menambahkan interceptor, Anda perlu mengimplementasikan antarmuka HandlerInterceptor dari org.springframework.web.servlet, yang memiliki tiga metode berikut:
- Metode preHandle
- Metode preHandle dijalankan sebelum controller dipanggil. Oleh karena itu, metode ini dapat digunakan untuk melakukan pra-pemrosesan, memodifikasi informasi permintaan, atau menambahkan informasi sebelum controller dijalankan.
- Parameter handler ketiga dari metode preHandle adalah objek yang mengabstraksi informasi dari metode yang diberi anotasi @RequestMapping.
- Tipe pengembalian dari metode preHandle adalah boolean. Jika mengembalikan true, proses akan berlanjut ke tahap berikutnya, tetapi jika mengembalikan false, proses akan dihentikan dan proses selanjutnya (interceptor berikutnya atau controller) tidak akan dijalankan.
- Metode postHandle
- Metode postHandle dijalankan setelah controller dipanggil. Oleh karena itu, metode ini dapat digunakan untuk melakukan pasca-pemrosesan setelah controller dijalankan.
- Metode afterCompletion
- Sesuai namanya, metode afterCompletion dijalankan setelah semua proses selesai, termasuk pembuatan hasil akhir di semua view.
Contoh Kode
- Daftarkan interceptor yang telah dibuat sebagai bean.
- Daftarkan interceptor yang telah dibuat ke dalam metode addInterceptors() dari antarmuka WebMvcConfigurer.
- Interceptor akan berjalan sesuai dengan urutan pendaftarannya di InterceptorRegistry.
Kegunaan Interceptor
Interceptor umumnya bertanggung jawab untuk memproses konsistensi informasi permintaan menggunakan logika layanan.
- Tugas Umum seperti Autentikasi/Otorisasi
- Contohnya, Anda dapat memeriksa autentikasi atau otorisasi yang terkait dengan permintaan klien sebelum diteruskan ke controller.
- Pencatatan Panggilan API
- Anda dapat mencatat informasi klien melalui objek HttpServletRequest dan HttpServletResponse yang diterima.
- Pengolahan Data yang Dikirim ke Controller
- Anda dapat memproses objek HttpServletRequest dan HttpServletResponse yang diterima dan mengirimkannya ke controller.
- Meniru AOP
- Parameter HandlerMethod ketiga dari metode preHandle() berisi informasi tambahan seperti tanda tangan metode yang akan dijalankan, sehingga Anda dapat menentukan apakah akan menjalankan logika berdasarkan informasi tersebut.
Filter vs Interceptor
- Filter dijalankan dalam konteks web, sedangkan interceptor dijalankan dalam konteks Spring, sehingga waktu eksekusi keduanya berbeda.
- Filter dapat menangani bagian sebelum dan sesudah Dispatcher Servlet, sedangkan interceptor dapat menangani bagian sebelum dan sesudah controller.
- Filter lebih baik digunakan untuk tugas yang harus diproses secara global tanpa bergantung pada Spring, atau untuk memvalidasi parameter input itu sendiri, atau ketika Anda menggunakan ServletRequest daripada HttpServletRequest.
- Interceptor lebih baik digunakan untuk tugas yang harus diproses secara global terkait dengan permintaan klien dalam lingkup Spring, atau ketika Anda perlu mencampurkan logika layanan.
- Interceptor dapat menangani pengecualian menggunakan @ControllerAdvice dan @ExceptionHandler, tetapi filter tidak dapat melakukannya.
- Filter biasanya menangani pengecualian yang terjadi pada titik tersebut dengan membungkus metode doFilter() dengan blok try~catch.
Argument Resolver
Apa Itu Argument Resolver?
Argument Resolver dapat secara tidak langsung membantu Anda membuat objek yang diinginkan dari nilai yang masuk dalam permintaan saat permintaan masuk ke controller.
Kegunaan Argument Resolver
Misalnya, anggaplah permintaan datang dengan token JWT. Kita perlu memvalidasi apakah token tersebut valid dan kemudian mengambil ID yang disimpan dalam token tersebut untuk membuat objek pengguna yang masuk.
Jika Argument Resolver tidak digunakan, proses validasi token dan konversi ke objek pengguna yang masuk harus diimplementasikan di setiap controller. Hal ini akan menyebabkan duplikasi kode di controller yang memerlukan validasi pengguna, dan meningkatkan tanggung jawab controller. Argument Resolver dapat mengatasi masalah ini.
Implementasi Argument Resolver
Argument Resolver dapat digunakan dengan mengimplementasikan HandlerMethodArgumentResolver. Antarmuka ini menentukan bahwa dua metode berikut harus diimplementasikan.
- Metode supportsParameter
- Buat anotasi khusus dan tempelkan pada parameter yang ingin Anda jalankan Argument Resolver. Metode supportsParameter() memeriksa apakah anotasi yang diinginkan ada di parameter metode yang diminta, dan mengembalikan true jika parameter tersebut berisi anotasi yang diinginkan.
- Metode resolveArgument
- Jika supportsParameter mengembalikan true, artinya ada metode dengan anotasi tertentu, metode ini mengikat parameter ke dalam bentuk yang diinginkan dan mengembalikannya.
Dengan menggunakan Argument Resolver, implementasi controller akan terlihat seperti ini:
Perbedaan Argument Resolver dan Interceptor
- Argument Resolver berjalan setelah interceptor, dan mengembalikan objek yang diinginkan dari nilai yang masuk dalam permintaan saat permintaan masuk ke controller.
- Sebaliknya, interceptor mencegat permintaan sebelum controller benar-benar dijalankan, dan tidak dapat mengembalikan objek apa pun. Hanya tipe pengembalian boolean atau void yang diperbolehkan.
Sumber
- https://mangkyu.tistory.com/173
- https://junhyunny.github.io/spring-boot/filter-interceptor-and-aop/
- https://supawer0728.github.io/2018/04/04/spring-filter-interceptor/
- https://tecoble.techcourse.co.kr/post/2021-05-24-spring-interceptor/
- https://baeldung-cn.com/spring-mvc-handlerinterceptor-vs-filter
- https://www.baeldung.com/spring-boot-add-filter
Pertanyaan Wawancara yang Diperkirakan dan Jawabannya
Apa itu Filter?
Filter adalah fitur yang memungkinkan pemrosesan tugas tambahan untuk semua permintaan yang sesuai dengan pola URL, sebelum dan sesudah permintaan tersebut diteruskan ke Dispatcher Servlet, dan bekerja di tingkat servlet container.
Kapan Filter Digunakan?
Filter dapat digunakan untuk menangani tugas yang harus diproses secara global tanpa bergantung pada Spring. Atau, filter dapat digunakan untuk memvalidasi parameter permintaan.
Contohnya, filter dapat digunakan untuk menangani tugas umum yang berkaitan dengan keamanan, pencatatan untuk semua permintaan, kompresi gambar/data dan pengkodean karakter, serta kustomisasi ServletRequest.
Apa itu Interceptor?
Interceptor adalah fitur yang memungkinkan Anda untuk mengakses atau memodifikasi permintaan dan respons sebelum dan sesudah Dispatcher Servlet memanggil controller, dan bekerja di tingkat Spring container.
Kapan Interceptor Digunakan?
Interceptor dapat digunakan untuk menangani tugas yang harus diproses secara global terkait dengan permintaan klien. Atau, interceptor dapat digunakan ketika Anda perlu memanggil logika layanan untuk memvalidasi sesuatu.
Contohnya, interceptor dapat digunakan untuk menangani tugas umum seperti autentikasi/otorisasi, pencatatan panggilan API, dan pengolahan data yang dikirim ke controller.
Apa Perbedaan Filter dan Interceptor?
Filter bekerja di tingkat servlet container, sedangkan interceptor bekerja di tingkat Spring container.
Filter dapat menangani bagian sebelum dan sesudah Dispatcher Servlet, sedangkan interceptor dapat menangani bagian sebelum dan sesudah controller.
Oleh karena itu, filter lebih baik digunakan untuk tugas yang harus diproses secara global tanpa bergantung pada Spring, dan interceptor lebih baik digunakan untuk tugas yang harus diproses secara global terkait dengan permintaan klien dalam lingkup Spring.
Apa itu Argument Resolver?
Argument Resolver adalah fitur yang dapat secara tidak langsung membantu Anda membuat objek yang diinginkan dari nilai yang masuk dalam permintaan saat permintaan masuk ke controller.
Kapan Argument Resolver Digunakan?
Argument Resolver dapat digunakan saat permintaan datang dengan token JWT, dan Anda perlu memvalidasi apakah token tersebut valid dan kemudian mengambil ID yang disimpan dalam token tersebut untuk membuat objek LoginMember.
Apa Perbedaan Interceptor dan Argument Resolver?
Argument Resolver mengembalikan objek yang diinginkan dari nilai yang masuk dalam permintaan saat permintaan masuk ke controller. Sedangkan, interceptor tidak dapat mengembalikan objek apa pun, dan Argument Resolver berjalan setelah interceptor.
Komentar0