Пролетни филтри WebFlux

1. Общ преглед

Използването на филтри е широко разпространено в уеб приложенията, тъй като те ни дават начин да модифицираме заявка или отговор, без да променяме крайните си точки.

В този бърз урок ще опишем възможните начини за тяхното внедряване с WebFlux Framework.

Тъй като няма да навлизаме в подробности за самата рамка WebFlux, може да искате да разгледате тази статия за повече подробности.

2. Зависимост на Maven

Първо, нека декларираме зависимостта WebFlux Maven:

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

3. Крайни точки

Първо трябва да създадем някои крайни точки. По един за всеки метод: базиран на анотация и функционален.

Нека започнем с контролера, базиран на анотации:

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

За функционалната крайна точка първо трябва да създадем манипулатор:

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

А също и картографиране на конфигурацията на рутера:

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

4. Видове WebFlux филтри

Рамката WebFlux предоставя два вида филтри: WebFilter s и HandlerFilterFunctions .

Основната разлика между тях е, че реализациите на WebFilter работят за всички крайни точки, а внедряванията на HandlerFilterFunction ще работят само за базираните на рутери .

4.1. WebFilter

Ще приложим WebFilter, за да добавим нова заглавка към отговора. В резултат на това всички отговори трябва да имат такова поведение:

@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

За това ние прилагаме логика, която задава HTTP състоянието на ЗАБРАНЕНО, когато параметърът „име“ е равен на „тест“.

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. Тестване

В WebFlux Framework има лесен начин да тествате нашите филтри: WebTestClient . Позволява ни да тестваме HTTP повиквания към нашите крайни точки.

Ето примери за базираната на анотации крайна точка:

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

И за функционалната крайна точка:

@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. Заключение

В този урок разгледахме и двата типа филтри WebFlux и разгледахме някои примери за кодове.

За повече информация относно WebFlux Framework, погледнете документацията.

Както винаги, пълният изходен код за примерите може да бъде намерен в GitHub.