1概要

最近のどのブラウザでも、Cross-Origin Resource Sharing(CORS)は、REST APIを介してデータを消費するHTML 5およびJSクライアントの出現に関連する仕様です。

多くの場合、JSを提供するホスト(例:

example.com

)はデータを提供するホスト(例:

api.example.com

)とは異なります。

このような場合、CORSはクロスドメイン通信を可能にします。

SpringはCORSのための一流のhttp://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html[support]を提供しています。 Spring Boot Webアプリケーション。


2コントローラ方式CORS構成

  • CORSを有効にするのは簡単です – 単に

    @CrossOrigin

    .アノテーションを追加

これをいくつかの異なる方法で実装することができます。


2.1.


_ @ RequestMapping –


アノテーション付きハンドラメソッドの

@ CrossOrigin_


@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
       //...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
       //...
    }
}

上記の例では、CORSは

retrieve()

メソッドに対してのみ有効です。


@ CrossOrigin

アノテーションの設定は行わなかったので、デフォルトの設定が行われます。

  • すべての起源は許可されています

  • 使用できるHTTPメソッドは

    @ RequestMapping

    で指定されているものです。

注釈(この例ではGET)
** プリフライトレスポンスがキャッシュされる時間(

maxAge)

は30です。

議事録


2.2. コントローラの

@ CrossOrigin


@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
       //...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
       //...
    }
}


@ CrossOrigin

がコントローラに追加されたので、

retrieve()



remove()

メソッドの両方がそれを有効にします。アノテーション属性

origins



methods



allowedHeaders



exposedHeaders



allowCredentials

、または

maxAge.

のいずれかの値を指定することで、構成をカスタマイズできます。


2.3.



@ CrossOrigin

on


コントローラとハンドラメソッド

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin("http://example.com")
    @RequestMapping("/{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()

メソッドは


http://example.com

.

の起点のみを許可します。


3グローバルCORS設定

きめ細かいアノテーションベースの設定に代わるものとして、SpringではコントローラからグローバルなCORS設定を定義できます。これは

Filter

ベースのソリューションを使用するのと似ていますが、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

メソッドもあります。実行時にこの配列を外部ソースからロードする必要がある場合に便利です。

さらに、

allowedMethods



allowedHeaders



exposedHeaders



maxAge



allowCredentials

もあり、これらを使用してレスポンスヘッダーを設定し、カスタマイズオプションを追加できます。


3.2. XMLネームスペース

この最小限のXML設定により、JavaConfigのものと同じデフォルトプロパティで

/



パスパターンのCORSが有効になります。

<mvc:cors>
    <mvc:mapping path="/** ** "/>
</mvc:cors>

カスタマイズされたプロパティでいくつかのCORSマッピングを宣言することも可能です。

<mvc:cors>

    <mvc:mapping path="/api/** ** "
        allowed-origins="http://domain1.com, http://domain2.com"
        allowed-methods="GET, PUT"
        allowed-headers="header1, header2, header3"
        exposed-headers="header1, header2" allow-credentials="false"
        max-age="123"/>

    <mvc:mapping path="/resources/** ** "
        allowed-origins="http://domain1.com"/>

</mvc:cors>


4使い方

CORS要求は、登録されているさまざまな

HandlerMappings

に自動的にディスパッチされます。これらはCORSプリフライトリクエストを処理し、http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/cors/CorsProcessor.html[

CorsProcessor

]を使用してCORSの単純で実際のリクエストを傍受します関連するCORS応答ヘッダ(

Access-Control-Allow-Origin

など)を追加するための実装(デフォルトでは

DefaultCorsProcessor

)。



CorsConfiguration


CORS要求の処理方法を指定できます。そしてとりわけ方法。これはさまざまな方法で提供されます。

複数の

__CorsConfiguration


がマップされた

Map

を指定することを可能にします。

/api/



などのパスパターンに
** サブクラスは独自の

CorsConfiguration__をオーバーライドすることによって提供することができます。


AbstractHandlerMapping#getCorsConfiguration(Object、
HttpServletRequest)

メソッド
** ハンドラは実装することができます

各要求に

CorsConfiguration

を提供するためのhttp://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/cors/CorsConfigurationSource.html[

CorsConfigurationSource

]インターフェース(

ResourceHttpRequestHandler

など)


5結論

この記事では、SpringがアプリケーションでCORSを有効にするためのサポートを提供する方法を示しました。

コントローラの設定から始めました。 CORSを1つの特定のメソッドまたはコントローラ全体に有効にするには、アノテーション

@ CrossOrigin

を追加するだけでよいことがわかりました。

最後に、コントローラの外部でCORS設定を制御したい場合は、設定ファイルでJavaConfigまたはXMLを使用して簡単に実行できることもわかりました。