Filtri WebFlux di primavera

1. Panoramica

L'uso dei filtri è molto diffuso nelle applicazioni web poiché ci danno un modo per modificare una richiesta o una risposta senza cambiare i nostri endpoint.

In questo breve tutorial, descriveremo i possibili modi per implementarli con WebFlux Framework.

Poiché non entreremo nei dettagli sul framework WebFlux stesso, potresti voler controllare questo articolo per maggiori dettagli.

2. Dipendenza da Maven

Prima di tutto, dichiariamo la dipendenza WebFlux Maven:

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

3. Endpoint

Dobbiamo prima creare alcuni endpoint. Uno per ogni metodo: basato sull'annotazione e basato sulla funzionalità.

Cominciamo con il controller basato sull'annotazione:

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

Per l'endpoint funzionale dobbiamo prima creare un gestore:

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

E anche una mappatura della configurazione del router:

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

4. Tipi di filtri WebFlux

Il quadro WebFlux fornisce due tipi di filtri: WebFilter s e HandlerFilterFunctions .

La differenza principale tra loro è che le implementazioni di WebFilter funzionano per tutti gli endpoint e le implementazioni di HandlerFilterFunction funzioneranno solo per quelli basati su router .

4.1. WebFilter

Implementeremo un WebFilter per aggiungere una nuova intestazione alla risposta. Di conseguenza, tutte le risposte dovrebbero avere questo comportamento:

@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

Per questo, implementiamo una logica che imposta lo stato HTTP su FORBIDDEN quando il parametro "name" è uguale a "test".

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

In WebFlux Framework c'è un modo semplice per testare i nostri filtri: WebTestClient . Ci consente di testare le chiamate HTTP ai nostri endpoint.

Ecco alcuni esempi dell'endpoint basato sull'annotazione:

@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(); }

E per l'endpoint funzionale:

@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. Conclusione

Abbiamo coperto entrambi i tipi di filtri WebFlux in questo tutorial e abbiamo dato un'occhiata ad alcuni esempi di codice.

Per ulteriori informazioni su WebFlux Framework, dai un'occhiata alla documentazione.

Come sempre, il codice sorgente completo per gli esempi può essere trovato su GitHub.