春のCORS

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を使用して簡単に実行できることもわかりました。