春のCORS

1。概要

最新のブラウザーでは、クロスオリジンリソースシェアリング(CORS)は、RESTAPIを介してデータを消費するHTML5およびJSクライアントの出現に関連する仕様です。

多くの場合、JSを提供するホスト(example.comなど)は、データを提供するホスト(api.example.comなど)とは異なります。このような場合、CORSはクロスドメイン通信を可能にします。

SpringはCORSのファーストクラスのサポートを提供し、SpringまたはSpring BootWebアプリケーションでCORSを構成する簡単で強力な方法を提供します。

2.コントローラーメソッドのCORS構成

CORSの有効化は簡単です–アノテーション@CrossOriginを追加するだけです

これは、いくつかの異なる方法で実装できます。

2.1。@CrossOrigin@ RequestMapping-注釈ハンドラメソッド

@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @RequestMapping(method = RequestMethod.GET, path = "/{id}") public Account retrieve(@PathVariable Long id) { // ... } @RequestMapping(method = RequestMethod.DELETE, path = "/{id}") public void remove(@PathVariable Long id) { // ... } }

上記の例では、retrieve()メソッドに対してCORSのみを有効にしました。@CrossOriginアノテーションの構成を設定していないことがわかるため、デフォルトが使用されます。

  • すべての起源が許可されます
  • 許可されるHTTPメソッドは、@ RequestMappingアノテーションで指定されたものです(この例ではGETです)
  • プリフライト応答がキャッシュされる時間(maxAge)は30分です

2.2。コントローラの@CrossOrigin

@CrossOrigin(origins = "//example.com", maxAge = 3600) @RestController @RequestMapping("/account") public class AccountController { @RequestMapping(method = RequestMethod.GET, path = "/{id}") public Account retrieve(@PathVariable Long id) { // ... } @RequestMapping(method = RequestMethod.DELETE, path = "/{id}") public void remove(@PathVariable Long id) { // ... } }

今回は、クラスレベルで@CrossOriginを追加しました。したがって、retrieve(メソッドとremove()メソッドの両方で有効になっています。アノテーション属性(originsmethodsallowedHeadersexposedHeadersallowCredentials、またはmaxAge )のいずれかの値を指定することにより、構成をカスタマイズできます

2.3。コントローラーとハンドラーメソッドの@CrossOrigin

@CrossOrigin(maxAge = 3600) @RestController @RequestMapping("/account") public class AccountController { @CrossOrigin("//example.com") @RequestMapping(method = RequestMethod.GET, "/{id}") public Account retrieve(@PathVariable Long id) { // ... } @RequestMapping(method = RequestMethod.DELETE, path = "/{id}") public void remove(@PathVariable Long id) { // ... } }

Springは、両方のアノテーションの属性を組み合わせて、マージされたCORS構成を作成します。

この例では、両方のメソッドのmaxAgeは3600秒で、メソッドremove()はすべてのオリジンを許可しますが、メソッドretrieve()//example.comからのオリジンのみを許可します

3.グローバルCORS構成

きめ細かいアノテーションベースの構成の代わりに、SpringではコントローラーからグローバルCORS構成を定義できます。これは、フィルターベースのソリューションの使用に似ていますが、Spring MVC内で宣言し、きめ細かい@CrossOrigin構成と組み合わせることができます。

デフォルトでは、すべてのオリジンとGET、HEAD、およびPOSTメソッドが許可されています。

3.1。JavaConfig

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }

上記の例では、アプリケーション内の任意のオリジンから任意のエンドポイントへのCORSリクエストを有効にします。

これをもう少しロックダウンしたい場合は、registry.addMappingメソッドがCorsRegistrationオブジェクトを返します。これは、追加の構成に使用できます。ありますallowedOriginsの私たちは許さ起源の配列を指定することができます方法は。これは、実行時に外部ソースからこの配列をロードする必要がある場合に役立ちます。

さらに、allowedMethodsallowedHeadersexposedHeadersmaxAge、およびallowCredentialsもあり、これらを利用して応答ヘッダーとカスタマイズオプションを設定できます。

3.2。XML名前空間

この最小限のXML構成により、JavaConfigと同じデフォルトプロパティを持つ/ **パスパターンでCORSが有効になります。

カスタマイズされたプロパティを使用して、いくつかのCORSマッピングを宣言することもできます。

4.Springセキュリティを備えたCORS

プロジェクトでSpringSecurityを使用する場合は、CORSで適切に機能することを確認するために追加の手順を実行する必要があります。CORSを最初に処理する必要があるためです。それ以外の場合、SpringSecurityはSpringMVCに到達する前に要求を拒否します。

幸い、SpringSecurityはすぐに使用できるソリューションを提供します。

@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and()... } }

この記事では、それについて詳しく説明します。

5.仕組み

CORSリクエストは、登録されているさまざまなHandlerMappingsに自動的にディスパッチされます。これらは、CORSプリフライトリクエストを処理し、CorsProcessor実装(デフォルトではDefaultCorsProcessor)を使用してCORSの単純なリクエストと実際のリクエストをインターセプトし、関連するCORSレスポンスヘッダー(Access-Control-Allow-Originなど)を追加します。

CorsConfigurationを使用すると、CORSリクエストの処理方法(許可されたオリジン、ヘッダー、メソッドなど)を指定できます。さまざまな方法で提供する場合があります。

  • AbstractHandlerMapping#setCorsConfiguration()を使用すると、/ api / **などのパスパターンにマップされた複数のCorsConfigurationを使用しマップを指定できます。
  • Subclasses may provide their own CorsConfiguration by overriding the AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest) method
  • Handlers may implement the CorsConfigurationSource interface (like ResourceHttpRequestHandler now does) to provide a CorsConfiguration for each request

6. Conclusion

In this article, we showed how Spring provides support for enabling CORS in our application.

We started with the configuration of the controller. We saw that we only need to add the annotation @CrossOrigin to enable CORS either to one particular method or the entire controller.

最後に、コントローラーの外部でCORS構成を制御する場合は、JavaConfigまたはXMLを使用して、構成ファイルでこれをスムーズに実行できることもわかりました。

例の完全なソースコードは、GitHubで入手できます。