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框架提供了兩種類型的過濾器: WebFilter
和HandlerFilterFunctions
。
它們之間的主要區別在於, 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上找到。