Spring WebFlux過濾器

1.概述

過濾器的使用在Web應用程序中非常普遍,因為它們為我們提供了一種在不更改端點的情況下修改請求或響應的方法。

在本快速教程中,我們將介紹使用WebFlux框架實現它們的可能方法。

由於我們將不涉及WebFlux框架本身的詳細信息,因此您可能需要查看本文以獲取更多詳細信息。

2. Maven依賴

首先,讓我們聲明WebFlux Maven依賴項:

<dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-webflux</artifactId>

 </dependency>

3.端點

我們必須首先創建一些端點。每種方法一個:基於註釋和基於功能。

讓我們從基於註釋的控制器開始:

@GetMapping(path = "/users/{name}")

 public Mono<String> getName(@PathVariable String name) {

 return Mono.just(name);

 }

對於功能端點,我們必須首先創建一個處理程序:

@Component

 public class PlayerHandler {

 public Mono<ServerResponse> getName(ServerRequest request) {

 Mono<String> name = Mono.just(request.pathVariable("name"));

 return ok().body(name, String.class);

 }

 }

以及路由器配置映射:

@Bean

 public RouterFunction<ServerResponse> route(PlayerHandler playerHandler) {

 return RouterFunctions

 .route(GET("/players/{name}"), playerHandler::getName)

 .filter(new ExampleHandlerFilterFunction());

 }

4. WebFlux過濾器的類型

該WebFlux框架提供了兩種類型的過濾器: WebFilterHandlerFilterFunctions

它們之間的主要區別在於, WebFilter所有端點實施工作**HandlerFilterFunction實現只會工作Router為基礎的人。**

4.1。 WebFilter

我們將實現一個WebFilter來向響應添加新的標頭。因此,所有響應都應具有以下行為:

@Component

 public class ExampleWebFilter implements WebFilter {



 @Override

 public Mono<Void> filter(ServerWebExchange serverWebExchange,

 WebFilterChain webFilterChain) {



 serverWebExchange.getResponse()

 .getHeaders().add("web-filter", "web-filter-test");

 return webFilterChain.filter(serverWebExchange);

 }

 }

4.2。 HandlerFilterFunction

為此,我們實現了一種邏輯,當“名稱”參數等於“測試”時,將HTTP狀態設置為FORBIDDEN

public class ExampleHandlerFilterFunction

 implements HandlerFilterFunction<ServerResponse, ServerResponse> {



 @Override

 public Mono<ServerResponse> filter(ServerRequest serverRequest,

 HandlerFunction<ServerResponse> 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<String> 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<String> 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();

 }

六,結論

在本教程中,我們已經介紹了兩種類型的WebFlux過濾器,並查看了一些代碼示例。

有關WebFlux框架的更多信息,請參閱 文檔

與往常一樣,示例的完整源代碼可以在GitHub上找到