Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

Ini adalah postingan yang diterjemahkan oleh AI.

제이온

[Spring] Apa itu Filter, Interceptor, dan Argument Resolver?

  • Bahasa penulisan: Bahasa Korea
  • Negara referensi: Semua negara country-flag

Pilih Bahasa

  • Bahasa Indonesia
  • English
  • 汉语
  • Español
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

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 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


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.

제이온
제이온
제이온
제이온
[Spring] Cara Menggunakan @Async Pelajari cara mengimplementasikan pemrosesan asinkron Java dengan mudah menggunakan Spring @Async. Dengan anotasi @Async, Anda dapat mengubah metode sinkron menjadi asinkron dan meningkatkan efisiensi dengan konfigurasi thread pool. Artikel ini juga memba

25 April 2024

[Java] Konsep Refleksi dan Cara Penggunaannya Refleksi adalah API yang mendukung program Java untuk mengakses informasi kelas selama program dijalankan dan memanipulasi kelas. Pada saat runtime, Anda dapat membuat kelas, mengakses bidang dan metode, tetapi hal ini dapat melanggar enkapsulasi dan meny

25 April 2024

[Efektif Java] Item 1. Pertimbangkan Metode Pabrik Statis Sebagai Pengganti Konstruktor Metode pabrik statis adalah cara yang fleksibel dan efisien untuk membuat instance alih-alih konstruktor. Mereka dapat diberi nama, mengembalikan instance yang sesuai dengan kondisi tertentu, dan meningkatkan kinerja melalui caching. Tidak seperti pola si

27 April 2024

[Non-Major, Survive as a Developer] 14. Ringkasan Konten Wawancara Teknis yang Sering Ditanyakan untuk Pengembang Pemula Panduan persiapan wawancara teknis untuk pengembang pemula. Area memori utama, struktur data, RDBMS dan NoSQL, berorientasi prosedur dan berorientasi objek, overriding dan overloading, algoritma penggantian halaman, proses dan thread, OSI 7 layer, TCP dan
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 April 2024

[Concurrency] Operasi Atomik: Memory Fence dan Memory Ordering Postingan blog ini menjelaskan cara mempertimbangkan urutan memori dalam operasi atomik, dan pentingnya opsi Ordering. Ini membahas berbagai opsi Ordering seperti Relaxed, Acquire, Release, AcqRel, SecCst, bersama dengan keuntungan dan kerugian dari masin
곽경직
곽경직
곽경직
곽경직
곽경직

12 April 2024

[React Hook] useState Artikel ini membahas tentang alasan mengapa React useState hook merender ulang seluruh komponen saat dilakukan re-rendering, cara mempertahankan nilai, dan penjelasan terperinci tentang struktur implementasi internalnya. Analisis kode ReactFiberHooks.js m
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

14 Maret 2024

Membuat CLI yang Menakjubkan dengan Rust Artikel ini menjelaskan cara mengimplementasikan aplikasi CLI dengan Rust. Dengan menggunakan library clap dan ratatui, kita akan membuat program CLI yang memiliki fitur login dan logout. Artikel ini mencakup semua aspek pengembangan CLI berbasis Rust, te
곽경직
곽경직
곽경직
곽경직
곽경직

13 Maret 2024

Apa itu JWT (JSON Web Token)? JSON Web Token (JWT) adalah standar terbuka untuk mengirimkan informasi secara aman, menggunakan token yang ditandatangani untuk menjaga integritas dan keamanan informasi. Header berisi jenis token dan algoritma penandatanganan, sementara payload berisi i
Seize the day
Seize the day
Seize the day
Seize the day
Seize the day

4 Maret 2024

[Javascript] Struktur Object (V8) Object JavaScript dalam mesin V8 dioptimalkan seperti struktur berdasarkan statusnya dan diubah menjadi mode Fast yang dioptimalkan atau mode Dictionary yang beroperasi sebagai hashmap. Mode Fast cepat karena kunci dan nilainya hampir berbentuk tetap, tet
곽경직
곽경직
곽경직
곽경직
곽경직

18 Maret 2024