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.