1.概要


以前の投稿

で、Cross-Origin Resource Sharing(CORS)仕様とSpring内でのそれの使用方法について学びました。

このクイックチュートリアルでは、




Spring 5


を使用して同様のCORS設定を設定します。 WebFluxフレームワーク ]。

まず最初に、アノテーションベースのAPIのメカニズムを有効にする方法を見ていきます。

次に、プロジェクト全体でグローバル設定として有効にする方法、または特別な

WebFilter

を使用して有効にする方法について分析します。

2.注釈付き要素でCORSを有効にする

Springは

@ CrossOrigin

アノテーションを提供してコントローラクラスやハンドラメソッドに対するCORSリクエストを有効にします

2.1. リクエストハンドラメソッドで

@ CrossOrigin

を使用する

このアノテーションをマッピングされたリクエストメソッドに追加しましょう。

@CrossOrigin
@PutMapping("/cors-enabled-endpoint")
public Mono<String> corsEnabledEndpoint() {
   //...
}

このエンドポイントから得られる応答を分析するには、(https://www.baeldung.com/spring-5-functional-web[この投稿]の「4.テスト」セクションで説明したように)

WebTestClient

を使用します。

ResponseSpec response = webTestClient.put()
  .uri("/cors-enabled-endpoint")
  .header("Origin", "http://any-origin.com")
  .exchange();

response.expectHeader()
  .valueEquals("Access-Control-Allow-Origin", "** ");

さらに、CORS設定が期待通りに機能していることを確認するために、プリフライトリクエストを試すことができます。

ResponseSpec response = webTestClient.options()
  .uri("/cors-enabled-endpoint")
  .header("Origin", "http://any-origin.com")
  .header("Access-Control-Request-Method", "PUT")
  .exchange();

response.expectHeader()
  .valueEquals("Access-Control-Allow-Origin", "** ");
response.expectHeader()
  .valueEquals("Access-Control-Allow-Methods", "PUT");
response.expectHeader()
  .exists("Access-Control-Max-Age");


@ CrossOrigin

アノテーションのデフォルト設定は以下のとおりです。

  • すべての起源を許可します(それは応答の ‘** ‘値を説明します)

ヘッダ)
** すべてのヘッダを許可

  • ハンドラメソッドによってマッピングされたすべてのHTTPメソッドが許可されます

  • 認証情報は有効になっていません

  • 「max-age」の値は1800秒(30分)です

ただし、注釈のパラメータを使用してこれらの値を上書きすることができます。

2.2. コントローラで

@ CrossOrigin

を使用する

このアノテーションはクラスレベルでもサポートされており、それはそのすべてのメソッドに影響します。

クラスレベルの設定がすべてのメソッドに適していない場合は、両方の要素に注釈を付けて目的の結果を得ることができます。

@CrossOrigin(value = { "http://allowed-origin.com" },
  allowedHeaders = { "Baeldung-Allowed" },
  maxAge = 900
)
@RestController
public class CorsOnClassController {

    @PutMapping("/cors-enabled-endpoint")
    public Mono<String> corsEnabledEndpoint() {
       //...
    }

    @CrossOrigin({ "http://another-allowed-origin.com" })
    @PutMapping("/endpoint-with-extra-origin-allowed")
    public Mono<String> corsEnabledWithExtraAllowedOrigin() {
       //...
    }

   //...
}

3.グローバル設定でCORSを有効にする

  • WebFluxConfigurer実装の__addCorsMappings()メソッドをオーバーライドすることで、グローバルCORS設定を定義することもできます。

さらに、実装にはSpring WebFlux設定をインポートするための

@ EnableWebFlux

アノテーションが必要です。

@Configuration
@EnableWebFlux
public class CorsGlobalConfiguration implements WebFluxConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry corsRegistry) {
        corsRegistry.addMapping("/** ** ")
          .allowedOrigins("http://allowed-origin.com")
          .allowedMethods("PUT")
          .maxAge(3600);
    }
}

その結果、その特定のパスパターンに対するクロスオリジン要求処理が可能になります。

デフォルト設定は

@ CrossOrigin

設定と似ていますが、

GET



HEAD

、および

POST

メソッドのみが許可されています。

この設定をローカルの設定と組み合わせることもできます。

  • 複数値属性の場合は、結果のCORS設定

各仕様の追加になります
** 一方、ローカル値は、ローカル値よりも優先されます。

単一値のものに対するグローバルなもの

ただし、この方法を使用しても機能的なエンドポイントには効果がありません。

4.

WebFilter

を使ってCORSを有効にする

機能的なエンドポイントでCORSを有効にする最善の方法は、

WebFilter

を使用することです。


この記事で

を見てきたように、エンドポイントの実装をそのままにしながら、

__WebFilter

__sを使用して要求と応答を変更できます。

クロスオリジン設定を簡単に処理するために、Springは組み込みの

CorsWebFilter

を提供します。

@Bean
CorsWebFilter corsWebFilter() {
    CorsConfiguration corsConfig = new CorsConfiguration();
    corsConfig.setAllowedOrigins(Arrays.asList("http://allowed-origin.com"));
    corsConfig.setMaxAge(8000L);
    corsConfig.addAllowedMethod("PUT");
    corsConfig.addAllowedHeader("Baeldung-Allowed");

    UrlBasedCorsConfigurationSource source =
      new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/** ** ", corsConfig);

    return new CorsWebFilter(source);
}

これは注釈付きのハンドラにも効果的ですが、より細かい

@ CrossOrigin

設定と組み合わせることはできません。


CorsConfiguration

にはデフォルトの設定がありません。

したがって、関連する属性をすべて指定しない限り、CORSの実装はかなり制限されます。

デフォルト値を設定する簡単な方法は、オブジェクトに

applyPermitDefaultValues()

メソッドを使用することです。

5.まとめ

結論として、私たちはウェブフラックスベースのサービスでCORSを有効にする方法の非常に短い例で学びました。

私たちはさまざまなアプローチを見てきました。したがって、今必要なことは、どれが私たちの要件に最も適しているかを分析することです。


私たちのGithubリポジトリ

には、このトピックに関する最先端のケースのほとんどを分析するテストケースとともに、たくさんの例があります。