Spring WebfluxとCORS
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リポジトリ
には、このトピックに関する最先端のケースのほとんどを分析するテストケースとともに、たくさんの例があります。