Filtres Spring WebFlux

1. Vue d'ensemble

L'utilisation de filtres est répandue dans les applications Web car ils nous permettent de modifier une demande ou une réponse sans changer nos points de terminaison.

Dans ce rapide tutoriel, nous décrirons les manières possibles de les implémenter avec WebFlux Framework.

Comme nous n'entrerons pas dans les détails du framework WebFlux lui-même, vous voudrez peut-être consulter cet article pour plus de détails.

2. Dépendance de Maven

Tout d'abord, déclarons la dépendance WebFlux Maven:

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

3. Points finaux

Nous devons d'abord créer des points de terminaison. Un pour chaque méthode: basé sur des annotations et basé sur des fonctionnalités.

Commençons par le contrôleur basé sur les annotations:

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

Pour le point de terminaison fonctionnel, nous devons d'abord créer un gestionnaire:

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

Et aussi un mappage de configuration de routeur:

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

4. Types de filtres WebFlux

Le framework WebFlux fournit deux types de filtres: WebFilter s et HandlerFilterFunctions .

La principale différence entre eux est que les implémentations WebFilter fonctionnent pour tous les points de terminaison et les implémentations HandlerFilterFunction ne fonctionneront que pour celles basées sur un routeur .

4.1. WebFilter

Nous allons implémenter un WebFilter pour ajouter un nouvel en-tête à la réponse. En conséquence, toutes les réponses doivent avoir ce comportement:

@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

Pour celui-ci, nous implémentons une logique qui définit le statut HTTP sur FORBIDDEN lorsque le paramètre «name» est égal à «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

Dans WebFlux Framework, il existe un moyen simple de tester nos filtres: le WebTestClient . Cela nous permet de tester les appels HTTP vers nos points de terminaison.

Voici des exemples du point de terminaison basé sur les annotations:

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

Et pour le point final fonctionnel:

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

Nous avons couvert les deux types de filtres WebFlux dans ce didacticiel et avons examiné quelques exemples de code.

Pour plus d'informations sur le Framework WebFlux, consultez la documentation.

Comme toujours, le code source complet des exemples est disponible à l'adresse over sur GitHub.