Filter WebFlux Musim Semi

1. Ikhtisar

Penggunaan filter tersebar luas di aplikasi web karena mereka memberi kita cara untuk mengubah permintaan atau tanggapan tanpa mengubah titik akhir kita.

Dalam tutorial singkat ini, kami akan menjelaskan kemungkinan cara mengimplementasikannya dengan Kerangka WebFlux.

Karena kami tidak akan membahas detail tentang kerangka WebFlux itu sendiri, Anda mungkin ingin membaca artikel ini untuk detail selengkapnya.

2. Ketergantungan Maven

Pertama-tama, mari kita deklarasikan dependensi WebFlux Maven:

 org.springframework.boot spring-boot-starter-webflux 

3. Titik akhir

Kita harus membuat beberapa titik akhir terlebih dahulu. Satu untuk setiap metode: berbasis anotasi dan berbasis fungsional.

Mari kita mulai dengan pengontrol berbasis anotasi:

@GetMapping(path = "/users/{name}") public Mono getName(@PathVariable String name) { return Mono.just(name); }

Untuk titik akhir fungsional kita harus membuat penangan terlebih dahulu:

@Component public class PlayerHandler { public Mono getName(ServerRequest request) { Mono name = Mono.just(request.pathVariable("name")); return ok().body(name, String.class); } }

Dan juga pemetaan konfigurasi router:

@Bean public RouterFunction route(PlayerHandler playerHandler) { return RouterFunctions .route(GET("/players/{name}"), playerHandler::getName) .filter(new ExampleHandlerFilterFunction()); }

4. Jenis Filter WebFlux

Framework WebFlux menyediakan dua jenis filter: WebFilter dan HandlerFilterFunctions .

Perbedaan utama di antara keduanya adalah penerapan WebFilter berfungsi untuk semua titik akhir dan penerapan HandlerFilterFunction hanya akan berfungsi untuk yang berbasis Router .

4.1. WebFilter

Kami akan menerapkan WebFilter untuk menambahkan tajuk baru ke respons. Akibatnya, semua respons harus memiliki perilaku ini:

@Component public class ExampleWebFilter implements WebFilter { @Override public Mono filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) { serverWebExchange.getResponse() .getHeaders().add("web-filter", "web-filter-test"); return webFilterChain.filter(serverWebExchange); } }

4.2. HandlerFilterFunction

Untuk yang satu ini, kami menerapkan logika yang menetapkan status HTTP ke DILARANG ketika parameter "nama" sama dengan "tes".

public class ExampleHandlerFilterFunction implements HandlerFilterFunction { @Override public Mono filter(ServerRequest serverRequest, HandlerFunction handlerFunction) { if (serverRequest.pathVariable("name").equalsIgnoreCase("test")) { return ServerResponse.status(FORBIDDEN).build(); } return handlerFunction.handle(serverRequest); } }

5. Pengujian

Dalam WebFlux Framework ada cara mudah untuk menguji filter kami: WebTestClient . Ini memungkinkan kami untuk menguji panggilan HTTP ke titik akhir kami.

Berikut adalah contoh titik akhir berbasis anotasi:

@Test public void whenUserNameIsBaeldung_thenWebFilterIsApplied() { EntityExchangeResult result = webTestClient.get() .uri("/users/baeldung") .exchange() .expectStatus().isOk() .expectBody(String.class) .returnResult(); assertEquals(result.getResponseBody(), "baeldung"); assertEquals( result.getResponseHeaders().getFirst("web-filter"), "web-filter-test"); } @Test public void whenUserNameIsTest_thenHandlerFilterFunctionIsNotApplied() { webTestClient.get().uri("/users/test") .exchange() .expectStatus().isOk(); }

Dan untuk titik akhir fungsional:

@Test public void whenPlayerNameIsBaeldung_thenWebFilterIsApplied() { EntityExchangeResult result = webTestClient.get() .uri("/players/baeldung") .exchange() .expectStatus().isOk() .expectBody(String.class) .returnResult(); assertEquals(result.getResponseBody(), "baeldung"); assertEquals( result.getResponseHeaders().getFirst("web-filter"), "web-filter-test"); } @Test public void whenPlayerNameIsTest_thenHandlerFilterFunctionIsApplied() { webTestClient.get().uri("/players/test") .exchange() .expectStatus().isForbidden(); }

6. Kesimpulan

Kami telah membahas kedua jenis filter WebFlux dalam tutorial ini dan telah melihat beberapa contoh kode.

Untuk informasi selengkapnya tentang Kerangka WebFlux, lihat dokumentasinya.

Seperti biasa, kode sumber lengkap untuk contoh dapat ditemukan di GitHub.