Filtres WebFlux Spring

Filtres Spring WebFlux

1. Vue d'ensemble

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

Dans ce rapide didacticiel, nous allons décrire les moyens 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 consulterthis article pour plus de détails.

2. Dépendance Maven

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


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

3. Points de terminaison

Nous devons d'abord créer des points de terminaison. Une pour chaque méthode: basée sur les annotations et sur les fonctions.

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 noeud final 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:WebFilters etHandlerFilterFunctions.

La principale différence entre eux est queWebFilter implementations work for all endpoints et HandlerFilterFunction implementations will only work for Router-based ones.

4.1. WebFilter

Nous allons implémenter unWebFilter pour ajouter un nouvel en-tête à la réponse. En conséquence, toutes les réponses devraient 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 l'état HTTP àFORBIDDEN lorsque le paramètre «nom» 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. Essai

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

Voici des exemples de points de terminaison basés sur des annotations:

@Test
public void whenUserNameIsexample_thenWebFilterIsApplied() {
    EntityExchangeResult result = webTestClient.get()
      .uri("/users/example")
      .exchange()
      .expectStatus().isOk()
      .expectBody(String.class)
      .returnResult();

    assertEquals(result.getResponseBody(), "example");
    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 whenPlayerNameIsexample_thenWebFilterIsApplied() {
    EntityExchangeResult result = webTestClient.get()
      .uri("/players/example")
      .exchange()
      .expectStatus().isOk()
      .expectBody(String.class)
      .returnResult();

    assertEquals(result.getResponseBody(), "example");
    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 examiné quelques exemples de code.

Pour plus d'informations sur le framework WebFlux, jetez un œil auxdocumentation.

Comme toujours, le code source complet des exemples peut être trouvéover on GitHub.