Spring WebFlux-filters

1. Overzicht

Het gebruik van filters is wijdverbreid in webapplicaties, omdat ze ons een manier bieden om een ​​verzoek of reactie te wijzigen zonder onze eindpunten te wijzigen.

In deze korte tutorial beschrijven we mogelijke manieren om ze te implementeren met het WebFlux Framework.

Aangezien we niet ingaan op details over het WebFlux-framework zelf, wil je misschien dit artikel lezen voor meer details.

2. Maven Afhankelijkheid

Laten we allereerst de WebFlux Maven-afhankelijkheid verklaren:

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

3. Eindpunten

We moeten eerst enkele eindpunten maken. Eén voor elke methode: op annotaties gebaseerd en op functies gebaseerd.

Laten we beginnen met de op aantekeningen gebaseerde controller:

@GetMapping (path = "/ gebruikers / {naam}") openbare Mono getName (@PathVariable Stringnaam) {return Mono.just (naam); }

Voor het functionele eindpunt moeten we eerst een handler maken:

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

En ook een toewijzing van een routerconfiguratie:

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

4. Soorten WebFlux-filters

Het WebFlux-framework biedt twee soorten filters: WebFilters en HandlerFilterFunctions.

Het belangrijkste verschil tussen hen is datWebFilter implementaties werken voor alle eindpunten enHandlerFilterFunctie implementaties werken alleen voor Routergebaseerde.

4.1. WebFilter

We implementeren een WebFilter om een ​​nieuwe koptekst aan het antwoord toe te voegen. Als gevolg hiervan zouden alle reacties dit gedrag moeten hebben:

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

4.2. HandlerFilterFunctie

Voor deze implementeren we een logica die de HTTP-status instelt op VERBODEN wanneer de parameter "naam" gelijk is aan "test".

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

5. Testen

In WebFlux Framework is er een gemakkelijke manier om onze filters te testen: het WebTestClient. Het stelt ons in staat om HTTP-oproepen naar onze eindpunten te testen.

Hier zijn voorbeelden van het op annotaties gebaseerde eindpunt:

@Test openbare leegte whenUserNameIsBaeldung_thenWebFilterIsApplied () {EntityExchangeResult resultaat = webTestClient.get () .uri ("/ gebruikers / baeldung") .exchange () .expectStatus (). IsOk () .expectBody (String.class) .returnResult (); assertEquals (result.getResponseBody (), "baeldung"); assertEquals (result.getResponseHeaders (). getFirst ("web-filter"), "web-filter-test"); } @Test openbare leegte whenUserNameIsTest_thenHandlerFilterFunctionIsNotApplied () {webTestClient.get (). Uri ("/ gebruikers / test") .exchange () .expectStatus (). IsOk (); }

En voor het functionele eindpunt:

@Test public void whenPlayerNameIsBaeldung_thenWebFilterIsApplied () {EntityExchangeResult resultaat = 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 openbare leegte whenPlayerNameIsTest_thenHandlerFilterFunctionIsApplied () {webTestClient.get (). Uri ("/ players / test") .exchange () .expectStatus (). IsForbidden (); }

6. Conclusie

We hebben beide typen WebFlux-filters in deze tutorial behandeld en enkele codevoorbeelden bekeken.

Raadpleeg de documentatie voor meer informatie over het WebFlux Framework.

Zoals altijd is de volledige broncode voor de voorbeelden te vinden op GitHub.