Filter di Spring Web MVC Menggunakan HandlerInterceptor
Yang sudah terbiasa membuat web menggunakan Servlet, pasti sudah tidak asing lagi dengan yang namanya HttpFilter
. Class yang dapat kita gunakan untuk melakukan proses filter (sebelum dan setelah) untuk class Servlet yang kita buat.
Spring Web MVC sendiri sebenarnya adalah framework web Spring yang berjalan diatas Servlet. Namun tidak direkomendasikan jika kita membuat HttpFilter
nya Servlet. Jika kita ingin membuat filter, sangat disarankan menggunakan HandlerInterceptor milik Spring Web MVC.
HandlerInterceptor
Cara kerja HandlerInterceptor
mirip sekali dengan HttpFilter
. Dimana HandlerInterceptor akan dieksekusi sebelum dan setelah Spring Controller dijalankan. Jika kita liat isi HandlerInterceptor
, ada beberapa method yang dapat kita gunakan untuk melakukan filter.
preHandle
, method ini akan dieksekusi sebelum Controller dieksekusi.postHandle
, method ini akan dieksekusi setelah Controller dieksekusi, tapi sebelum view di render.afterCompletion
, method ini akan dieksekusi setelah view di render.
Untuk Apa HandlerInterceptor?
Jika ditanya, kenapa kita butuh HandlerInterceptor? dan kapan kita bisa menggunakan HandlerInterceptor? Jawabannya sederhana.
Saat kita membuat code yang berulang di action Controller.
Apa aja yang biasa kita buat berulang di action Controller? Contohnya seperti :
- Autentikasi user login.
- Monitoring
- Logging
- dan lain-lain.
Misal, kita membuat Backend RESTful, dimana client harus mengirim API-Key menggunakan BasicAuth. Dari pada kita validasi API-Key nya di tiap action controller, lebih baik kita validasi di HandlerInterceptor, sehingga jika request dari client masuk ke action Controller, kita sudah bisa pastikan kalo request tersebut sudah ter-autentikasi.
Demo HandlerInterceptor
Sekarang kita coba buat contoh demo HandlerInterceptor
. Sederhana saya, kita akan membuat HandlerInterceptor
yang melakukan filter, jika di HTTP Request terdapat parameter “secure=true”, kita anggap requestnya Valid, jika tidak ada parameter “secure=true”, kita tolak requestnya, dan beli response UNAUTHORIZED 401.
HandlerInterceptor
Mendaftarkan HandlerInterceptor
HandlerInterceptor
tidak bisa secara otomatis berjalan, kita perlu mendaftarkan HandlerInterceptor
ke InterceptorRegistry
. Caranya kita perlu membuat configuration WebMvcConfigurer
, lalu meregistrasikan HandlerInterceptor
kita di method addInterceptors()
.
Sekarang semua HTTP Request dari client, akan divalidasi terlebih dahulu oleh DemoInterceptor, jika valid maka request akan diteruskan ke action Controller, jika tidak valid, request akan ditolak oleh DemoInterceptor.