![translation](https://cdn.durumis.com/common/trans.png)
Ini adalah postingan yang diterjemahkan oleh AI.
Pilih Bahasa
Teks yang dirangkum oleh AI durumis
- Filter adalah fitur standar J2EE yang memungkinkan Anda untuk memproses tugas tambahan untuk semua permintaan yang sesuai dengan pola URL sebelum dan sesudah permintaan dikirim ke servlet dispatcher. Ia beroperasi di web container, sementara interceptor adalah teknologi yang disediakan Spring yang memungkinkan Anda untuk merujuk atau memproses permintaan dan respons sebelum dan sesudah servlet dispatcher memanggil controller. Interceptor beroperasi di konteks Spring.
- Argument Resolver dapat secara tidak langsung membantu Anda membuat objek yang diinginkan dari nilai yang disertakan dalam permintaan saat permintaan masuk ke controller.
- Filter dan interceptor berbeda dalam hal apakah mereka beroperasi di konteks Spring atau web container, apakah mereka memproses permintaan berdasarkan servlet dispatcher atau controller. Argument Resolver beroperasi setelah interceptor dan mengembalikan objek tertentu.
Apa itu Filter?
Filter adalah fitur standar J2EE yang memungkinkan pemrosesan tugas tambahan untuk semua permintaan yang sesuai dengan pola URL, sebelum atau sesudah permintaan dikirimkan ke Dispatcher Servlet. Dengan kata lain, Filter dikelola oleh web container seperti Tomcat, bukan Spring container, sehingga memproses permintaan sebelum mencapainya.
Implementasi Filter
Untuk menambahkan Filter, Anda perlu mengimplementasikan interface 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 sekali untuk menginisialisasi objek Filter, dan kemudian semua permintaan akan diproses melalui metode doFilter().
- Metode doFilter
- Metode ini dijalankan oleh web container sebelum setiap permintaan HTTP yang sesuai dengan pola URL dikirimkan ke Dispatcher Servlet, dan sebelum Dispatcher Servlet mengirim respons HTTP ke klien.
Metode doFilter() memiliki parameter FilterChain, yang digunakan untuk meneruskan permintaan ke tujuan berikutnya. Dengan memasukkan proses yang diperlukan sebelum dan sesudah chain.doFilter(), Anda dapat melakukan pemrosesan yang Anda inginkan.
- Metode ini dijalankan oleh web container sebelum setiap permintaan HTTP yang sesuai dengan pola URL dikirimkan ke Dispatcher Servlet, dan sebelum Dispatcher Servlet mengirim respons HTTP ke klien.
- Metode destory
- Metode ini digunakan untuk menghapus objek Filter dari layanan dan mengembalikan sumber daya yang digunakan. Ini akan dipanggil sekali oleh web container, dan kemudian tidak akan lagi diproses oleh doFilter().
Contoh Kode - Spesifikasi Servlet
@WebFilter("/*")
public class dolphagoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
//Pra-pemrosesan di sini
request.setCharacterEncoding("UTF-8");
System.out.println("Sebelum doFilter()....");
filterChain.doFilter(request, response);
//Pasca-pemrosesan di sini
System.out.println("Setelah doFilter()....");
}
@Override
public void destroy() { }
Contoh Kode - @Component
@Order(1)
@Component
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public void destroy() { }
- @Component: Filter dapat didaftarkan sebagai bean Spring.
- @Order: Anda dapat mengatur urutan jika ada beberapa Filter.
- Dengan mendaftarkan Filter yang sesuai dengan spesifikasi servlet sebagai bean Spring, Anda dapat menggunakan bean Spring lainnya yang sesuai dengan spesifikasi Spring.
Contoh Kode - @Configuration
@Configuration
public class CustomRegistrationBean {
@Bean
public FilterRegistrationBean customFilterBean() {
FilterRegistrationBean registration = new FilterRegistrationBean<>();
registration.setFilter(new CustomFilter());
registration.setOrder(1);
registration.addUrlPatterns("/api/*");
return registration;
}
Jika Anda ingin Filter hanya bekerja untuk URI tertentu, Anda dapat mendaftarkannya sebagai bean Spring menggunakan FilterRegistrationBean.
Tujuan Filter
Filter biasanya bertanggung jawab untuk memvalidasi dan memproses parameter permintaan itu sendiri.
- Tugas Umum Terkait Keamanan
- Karena Filter dijalankan di web container, ia dapat melakukan pemeriksaan keamanan (seperti XSS, pertahanan CSRF) dan memblokir permintaan yang tidak valid. Karena permintaan tidak dapat dikirimkan ke Spring container, hal ini dapat meningkatkan stabilitas.
- Pelacakan untuk Setiap Permintaan
- Kompresi Gambar/Data dan Pengkodean String
- Filter telah mengimplementasikan fungsionalitas yang digunakan secara umum di aplikasi web, seperti kompresi gambar atau data, dan pengkodean string.
- Penyesuaian ServletRequest
- HttpServletRequest hanya dapat membaca konten Body sekali. Karena itu, Filter atau Interceptor tidak dapat membaca Body. Anda dapat membuat ServletRequest khusus untuk melacak Body.
Interceptor
Apa itu Interceptor?
Interceptor adalah teknologi yang disediakan oleh Spring, tidak seperti Filter, yang merupakan spesifikasi standar J2EE. Ini memungkinkan Anda untuk mereferensikan atau memproses permintaan dan respons sebelum dan sesudah Dispatcher Servlet memanggil controller. Dengan kata lain, tidak seperti Filter yang bekerja di web container, Interceptor bekerja di Spring context.
Dispatcher Servlet meminta Handler Mapping untuk menemukan controller yang sesuai. Sebagai hasilnya, HandlerExecutionChain dikembalikan. Jadi, jika rantai eksekusi ini memiliki satu atau lebih Interceptor yang didaftarkan, ia akan secara berurutan menjalankan Interceptor sebelum controller dijalankan, dan jika tidak ada Interceptor, ia akan langsung menjalankan controller.
Implementasi Interceptor
Untuk menambahkan Interceptor, Anda perlu mengimplementasikan interface org.springframework.web.servlet.HandlerInterceptor, yang memiliki tiga metode berikut.
- Metode preHandle
- Metode preHandle dijalankan sebelum controller dipanggil. Oleh karena itu, Anda dapat menggunakannya untuk melakukan pemrosesan pra-pemrosesan sebelum controller atau untuk memproses atau menambahkan informasi permintaan.
- Parameter handler pada metode preHandle adalah objek yang merangkum informasi tentang metode yang dihiasi dengan @RequestMapping.
- Jenis pengembalian metode preHandle adalah boolean. Jika nilai pengembaliannya true, maka proses akan dilanjutkan ke tahap berikutnya, tetapi jika false, maka proses akan dihentikan dan proses berikutnya (Interceptor berikutnya atau controller) tidak akan dilakukan.
- Metode postHandle
- Metode postHandle dijalankan setelah controller dipanggil. Karena itu, Anda dapat menggunakannya untuk melakukan pemrosesan pasca-pemrosesan setelah controller.
- Metode afterCompletion
- Seperti namanya, metode afterCompletion dijalankan setelah semua tugas selesai, termasuk pembuatan hasil akhir dari semua view.
Contoh Kode
@Component
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor());
registry.addInterceptor(new LoggingInterceptor());
}
- Daftarkan Interceptor yang telah Anda buat sebagai bean.
- Daftarkan Interceptor yang telah Anda buat ke metode addInterceptors() dari interface WebMvcConfigurer.
- Interceptor akan dijalankan sesuai urutan yang Anda daftarkan ke InterceptorRegistry.
Tujuan Interceptor
Interceptor biasanya bertanggung jawab untuk memproses konsistensi informasi permintaan menggunakan logika layanan.
- Tugas Umum seperti Autentikasi/Otorisasi
- Sebagai contoh, Anda dapat memeriksa tugas-tugas yang berkaitan dengan permintaan klien, seperti autentikasi atau otorisasi, sebelum diteruskan ke controller.
- Pelacakan Panggilan API
- Anda dapat merekam informasi klien melalui objek HttpServletRequest dan HttpServletResponse yang diteruskan.
- Pemrosesan Data yang Dikirimkan ke Controller
- Anda dapat memproses objek HttpServletRequest dan HttpServletResponse yang diteruskan dan mengirimkannya ke controller.
- Peniruan AOP
- Anda dapat mengetahui tanda tangan metode yang akan dijalankan, seperti HandlerMethod, yang merupakan parameter ketiga dari metode preHandle(), dan menentukan apakah akan menjalankan logika berdasarkan informasi tambahan tersebut.
Filter vs Interceptor
- Filter dijalankan di web context, sedangkan Interceptor dijalankan di Spring context, sehingga waktu eksekusinya berbeda.
- Filter dapat menangani bagian sebelum dan sesudah Dispatcher Servlet, sedangkan Interceptor dapat menangani bagian sebelum dan sesudah controller.
- Filter lebih baik digunakan jika Anda perlu memproses tugas secara global terlepas dari Spring, memvalidasi parameter input itu sendiri, atau menggunakan ServletRequest alih-alih HttpServletRequest.
- Interceptor lebih baik digunakan jika Anda perlu memproses tugas secara global yang berkaitan dengan permintaan klien yang memasuki Spring, atau jika Anda perlu mencampurkan logika layanan.
- Interceptor dapat menangani pengecualian menggunakan @ControllerAdvice dan @ExceptionHandler, tetapi Filter tidak dapat menggunakannya untuk menangani pengecualian.
- Filter biasanya menangani pengecualian yang terjadi pada titik waktu tersebut dengan mengelilingi metode doFilter() dengan blok try~catch.
Argument Resolver
Apa itu Argument Resolver?
Argument Resolver secara tidak langsung dapat membuat objek yang Anda inginkan dari nilai yang masuk dalam permintaan, ketika permintaan masuk ke controller.
Tujuan Argument Resolver
Misalnya, asumsikan bahwa permintaan masuk dengan JWT token. Kita perlu memvalidasi apakah token tersebut merupakan token yang valid, lalu mengambil id yang disimpan dalam token dan membuatnya menjadi objek pengguna login.
Dalam kasus seperti ini, jika Anda tidak menggunakan Argument Resolver, Anda harus mengimplementasikan proses validasi token dan konversinya menjadi objek pengguna login di setiap controller. Hal ini akan menyebabkan kode yang berlebihan di controller yang membutuhkan validasi pengguna, dan tanggung jawab controller akan meningkat. Argument Resolver dapat mengatasi masalah ini.
Implementasi Argument Resolver
ArgumentResolver dapat digunakan dengan mengimplementasikan HandlerMethodArgumentResolver. Dan interface ini menentukan bahwa Anda harus mengimplementasikan dua metode di bawah ini.
boolean supportsParameter(MethodParameter parameter);
@Nullable
- Metode supportsParameter
- Buat anotasi tertentu untuk parameter yang ingin Anda jalankan ArgumentResolver, dan letakkan di depannya. Metode supportsParameter() memeriksa apakah anotasi yang Anda inginkan disertakan dalam parameter metode yang diminta, dan mengembalikan true jika disertakan.
- Metode resolveArgument
- Jika Anda menerima true di supportsParameter, yaitu jika ada metode dengan anotasi tertentu, maka ini adalah metode yang mengikat informasi ke parameter dalam format yang Anda inginkan dan mengembalikannya.
Implementasi controller seperti ini ketika menggunakan Argument Resolver.
@GetMapping("/me")
public ResponseEntity findMemberOfMine(@AuthenticationPrincipal LoginMember loginMember) {
MemberResponse memberResponse = memberService.findMember(loginMember.getId());
return ResponseEntity.ok().body(memberResponse);
Perbedaan Argument Resolver dan Interceptor
- Argument Resolver bekerja setelah Interceptor, dan mengembalikan objek yang Anda inginkan dari nilai yang masuk dalam permintaan ketika permintaan masuk ke controller.
- Di sisi lain, Interceptor mencegat permintaan sebelum controller benar-benar dijalankan, dan tidak dapat mengembalikan objek tertentu. Hanya ada jenis pengembalian boolean atau void.
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 dan Jawaban Wawancara yang Diharapkan
Apa itu Filter?
Filter adalah fitur yang memungkinkan pemrosesan tugas tambahan untuk semua permintaan yang sesuai dengan pola URL, sebelum atau sesudah permintaan dikirimkan ke Dispatcher Servlet, dan bekerja di tingkat container servlet.
Kapan Filter digunakan?
Filter dapat digunakan untuk memproses tugas secara global terlepas dari Spring. Atau, ia digunakan ketika memvalidasi parameter permintaan.
Tugas umum yang diprosesnya meliputi tugas umum terkait keamanan, pelacakan untuk setiap permintaan, kompresi gambar/data dan pengkodean string, dan penyesuaian ServletRequest.
Apa itu Interceptor?
Interceptor adalah fitur yang memungkinkan Anda untuk mereferensikan atau memproses permintaan dan respons sebelum dan sesudah Dispatcher Servlet memanggil controller, dan bekerja di tingkat Spring container, berbeda dengan Filter.
Kapan Interceptor digunakan?
Interceptor dapat digunakan untuk memproses tugas secara global yang berkaitan dengan permintaan klien, atau ketika memvalidasi logika layanan.
Tugas umum yang diprosesnya meliputi tugas umum seperti autentikasi/otorisasi, pelacakan panggilan API, pemrosesan data yang dikirimkan ke Controller.
Apa perbedaan antara Filter dan Interceptor?
Filter dijalankan di tingkat container servlet, sedangkan Interceptor dijalankan 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 jika Anda perlu memproses tugas secara global terlepas dari Spring, sedangkan Interceptor lebih baik digunakan jika Anda perlu memproses tugas secara global yang berkaitan dengan permintaan klien.
Apa itu Argument Resolver?
Argument Resolver secara tidak langsung dapat membuat objek yang Anda inginkan dari nilai yang masuk dalam permintaan, ketika permintaan masuk ke controller.
Kapan Argument Resolver digunakan?
Ia dapat digunakan ketika permintaan masuk dengan JWT token, dan Anda perlu memvalidasi apakah token tersebut merupakan token yang valid, lalu mengambil id yang disimpan dalam token dan membuatnya menjadi objek LoginMember.
Apa perbedaan antara Interceptor dan Argument Resolver?
Argument Resolver mengembalikan objek yang Anda inginkan dari nilai yang masuk dalam permintaan, ketika permintaan masuk ke controller. Di sisi lain, Interceptor tidak dapat mengembalikan objek seperti itu, dan Argument Resolver dijalankan setelah Interceptor dijalankan.