Tavaszi WebFlux szűrők

1. Áttekintés

A szűrők használata elterjedt a webalkalmazásokban, mivel ezek lehetővé teszik egy kérés vagy válasz módosítását a végpontok megváltoztatása nélkül.

Ebben a gyors bemutatóban leírjuk a WebFlux keretrendszerrel történő megvalósításuk lehetséges módjait.

Mivel nem térünk ki részletesen magára a WebFlux keretrendszerre, érdemes megnézni ezt a cikket további részletekért.

2. Maven-függőség

Először deklaráljuk a WebFlux Maven függőségét:

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

3. Végpontok

Először létre kell hoznunk néhány végpontot. Minden módszerhez egy: annotáció alapú és funkcionális alapú.

Kezdjük az annotáció alapú vezérlővel:

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

A funkcionális végponthoz először kezelőt kell létrehoznunk:

@ Component public class PlayerHandler {public Mono getName (ServerRequest kérés) {Mono name = Mono.just (request.pathVariable ("név")); return ok (). body (név, String.osztály); }}

És egy router konfigurációs leképezése is:

@Bean nyilvános RouterFunction útvonal (PlayerHandler playerHandler) {return RouterFunctions .route (GET ("/ játékosok / {név}"), playerHandler :: getName) .filter (új példaHandlerFilterFunction ()); }

4. A WebFlux szűrők típusai

A WebFlux keretrendszer kétféle szűrőt kínál: WebFilters és HandlerFilterFunctions.

A fő különbség köztük azWebFilter a megvalósítás minden végpontra érvényes ésHandlerFilterFunction a megvalósítások csak akkor működnek Router-alapúak.

4.1. WebFilter

Megvalósítjuk a WebFilter új fejléc hozzáadása a válaszhoz. Ennek eredményeként minden válasznak ezt a viselkedést kell követnie:

@Component public class ExampleWebFilter implementálja a WebFilter {@Orride public Mono filter (ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {serverWebExchange.getResponse () .getHeaders (). Add ("web-filter", "web-filter-test"); return webFilterChain.filter (serverWebExchange); }}

4.2. HandlerFilterFunction

Ehhez megvalósítunk egy logikát, amely a HTTP állapotot állítja TILTOTT amikor a „név” paraméter megegyezik a „teszt” paraméterrel.

public class ExampleHandlerFilterFunction implementálja a HandlerFilterFunction {@Override public Mono filter (ServerRequest serverRequest, HandlerFunction handlerFunction) {if (serverRequest.pathVariable ("név"). equalsIgnoreCase ("teszt")) {return ServerResponse.status (FORBIDD); } return handlerFunction.handle (serverRequest); }}

5. Tesztelés

A WebFlux keretrendszerben a szűrők tesztelésének egyszerű módja van: a WebTestClient. Ez lehetővé teszi számunkra a HTTP-hívások tesztelését a végpontjainkhoz.

Íme néhány példa az annotáción alapuló végpontra:

@Test public void whenUserNameIsBaeldung_thenWebFilterIsApplied () {EntityExchangeResult result = webTestClient.get () .uri ("/ users / baeldung") .exchange () .expectStatus (). IsOk () .expectBody (String.class). 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 (); }

És a funkcionális végpontról:

@Test public void whenPlayerNameIsBaeldung_thenWebFilterIsApplied () {EntityExchangeResult result = webTestClient.get () .uri ("/ players / baeldung") .exchange () .expectStatus (). IsOk () .expectBody (String.class). assertEquals (result.getResponseBody (), "baeldung"); assertEquals (result.getResponseHeaders (). getFirst ("web-szűrő"), "web-szűrő-teszt"); } @Test public void whenPlayerNameIsTest_thenHandlerFilterFunctionIsApplied () {webTestClient.get (). Uri ("/ players / test") .exchange () .expectStatus (). IsForbidden (); }

6. Következtetés

Ebben az oktatóanyagban mindkét típusú WebFlux szűrőt áttekintettük, és néhány kód példát megnéztünk.

A WebFlux keretrendszerről további információt a dokumentációban talál.

Mint mindig, a példák teljes forráskódja megtalálható a GitHub oldalon.