Spring WebFluxフィルタ

Spring WebFluxフィルター

1. 概要

エンドポイントを変更せずにリクエストまたはレスポンスを変更する方法を提供するため、フィルターの使用はWebアプリケーションで広く使用されています。

このクイックチュートリアルでは、WebFluxフレームワークを使用してそれらを実装するための可能な方法について説明します。

WebFluxフレームワーク自体の詳細については説明しないため、詳細についてはthis articleを確認することをお勧めします。

2. メーベン依存

まず、WebFlux Mavenの依存関係を宣言しましょう。


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

3. エンドポイント

最初にいくつかのエンドポイントを作成する必要があります。 各メソッドに1つ:注釈ベースと機能ベース。

アノテーションベースのコントローラーから始めましょう:

@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フレームワークは、WebFiltersHandlerFilterFunctionsの2種類のフィルターを提供します。

それらの主な違いは、WebFilter implementations work for all endpoints HandlerFilterFunction implementations will only work for Router-based ones.です。

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

これには、「name」パラメーターが「test」と等しい場合にHTTPステータスをFORBIDDENに設定するロジックを実装します。

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 whenUserNameIsexample_thenWebFilterIsApplied() {
    EntityExchangeResult result = webTestClient.get()
      .uri("/users/example")
      .exchange()
      .expectStatus().isOk()
      .expectBody(String.class)
      .returnResult();

    assertEquals(result.getResponseBody(), "example");
    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 whenPlayerNameIsexample_thenWebFilterIsApplied() {
    EntityExchangeResult result = webTestClient.get()
      .uri("/players/example")
      .exchange()
      .expectStatus().isOk()
      .expectBody(String.class)
      .returnResult();

    assertEquals(result.getResponseBody(), "example");
    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フレームワークの詳細については、documentationを参照してください。

いつものように、例の完全なソースコードはover on GitHubにあります。