春のCORS
1. 概要
最新のブラウザでは、Cross-Origin Resource Sharing(CORS)は、REST APIを介してデータを消費するHTML5およびJSクライアントの出現に関連する仕様です。
多くの場合、JSを提供するホスト(例: example.com)は、データを提供するホストとは異なります(例: api.example.com)。 このような場合、CORSはクロスドメイン通信を可能にします。
SpringはCORSにファーストクラスのsupportを提供し、SpringまたはSpring BootWebアプリケーションでそれを構成する簡単で強力な方法を提供します。
参考文献:
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.)のいずれかの値を指定することにより、構成をカスタマイズできます。 s
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が有効になります。
カスタマイズされたプロパティでいくつかのCORSマッピングを宣言することもできます。
4. 使い方
CORSリクエストは、登録されているさまざまなHandlerMappingsに自動的にディスパッチされます。 関連するCORS応答ヘッダー(Access-Control-Allow-Originなど)を追加するために、CORSプリフライトリクエストを処理し、CorsProcessor実装(デフォルトではDefaultCorsProcessor)を使用してCORSの単純なリクエストと実際のリクエストをインターセプトします。
CorsConfigurationを使用すると、CORSリクエストの処理方法(許可されたオリジン、ヘッダー、メソッドなど)を指定できます。 これはさまざまな方法で提供されます。
-
AbstractHandlerMapping#setCorsConfiguration()を使用すると、/api/**などのパスパターンにマップされた複数のCorsConfigurationsを使用してMapを指定できます。
-
サブクラスは、AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)メソッドをオーバーライドすることにより、独自のCorsConfigurationを提供できます。
-
ハンドラーは、各要求にCorsConfigurationを提供するために、(ResourceHttpRequestHandlerが現在実装しているように)CorsConfigurationSourceインターフェースを実装できます。
5. 結論
この記事では、SpringがアプリケーションでCORSを有効にするためのサポートを提供する方法を示しました。
コントローラーの構成から始めました。 1つの特定のメソッドまたはコントローラー全体のいずれかでCORSを有効にするには、アノテーション@CrossOriginを追加するだけでよいことがわかりました。
最後に、コントローラーの外部でCORS構成を制御する場合、JavaConfigまたはXMLを使用して、構成ファイルでこれを簡単に実行できることもわかりました。
例の完全なソースコードは、over on GitHubで入手できます。