次のエラー メッセージが表示される場合があります:
CORS ポリシーによってブロックされました: 要求されたリソースに「Access-Control-Allow-Origin」ヘッダーが存在しません
このエラーは、Access-Control-Allow-Origin ヘッダーがリソースにないため、特定のアドレスへのリクエストが CORS プロトコルによってブロックされたことを示します。
クロスオリジン問題の根本的な原因は、ブラウザーがセキュリティ上の理由から、現在のサイト外のリソースへのアクセスを制限していることです。
たとえば、http://127.0.0.1:8080/ でホストされている Web サイトに特定のページがあるとします。同じサイトからリソースにアクセスする場合、制限はありません。ただし、別のサイト (例: http://127.0.0.1:8081) からリソースにアクセスしようとすると、ブラウザはリクエストをブロックします。
注: プロトコル、ドメイン、ポートは「同一オリジン」の定義の一部として考慮されます。
img タグや script タグなどの src 属性を持つ要素には、この制限は適用されません。
歴史的に、フロントエンドとバックエンドが分離されていなかったときは、ページとリクエスト インターフェイスは同じドメインとポートの下に存在していました。これにより、ブラウザーは、1 つのドメインでホストされているページからのリクエストが同じドメインのリソースをリクエストできるようになります。
たとえば、http://127.0.0.1:8080/index.html は http://127.0.0.1:8080/a/b/c/userLit を自由にリクエストできます。
現在、フロントエンドとバックエンドが異なるアプリケーションに分離されているため、これは許可されておらず、CORS 問題の原因となります。
オリジン (またはソース) は、プロトコル、ドメイン、およびポート番号で構成されます。
URL はプロトコル、ドメイン、ポート、パスで構成されます。 2 つの URL は、プロトコル、ドメイン、ポートがすべて同一である場合、「同一オリジン」とみなされます。これら 3 つの要素のいずれかに違いがある場合、クロスオリジン リクエストが構成されます。
https://www.baidu.com/index.html のクロスオリジン比較を検討してください:
URL | Cross-Origin | Reason |
---|---|---|
https://www.baidu.com/more/index.html | No | Same protocol, domain, and port |
https://map.baidu.com/ | Yes | Different domain |
http://www.baidu.com/index.html | Yes | Different protocol |
https://www.baidu.com:81/index.html | Yes | Different port |
同一オリジン ポリシーは、ブラウザの基本的なセキュリティ機能です。これがないと、ブラウザの通常の機能が危険にさらされる可能性があります。 Web アーキテクチャはこのポリシーに大きく依存しており、ブラウザはセキュリティを確保するためにこのポリシーを実装しています。
同一生成元ポリシーには以下が含まれます:
フロントエンドとバックエンドが別々にデプロイされているプロジェクトでは、CORS に対処することが重要です。 Cookie はユーザーのログイン情報を保存するために使用され、Spring インターセプターが権限を管理します。インターセプターと CORS が間違った順序で処理されると問題が発生し、CORS エラーが発生します。
HTTP リクエストは、サーブレットに到達する前にまずフィルターを通過し、次にインターセプターに到達します。認証インターセプトの前に CORS 処理が確実に行われるように、CORS 構成をフィルターに配置できます。
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } }
JSONP はフロントエンドでクロスオリジンの問題に対処できますが、サポートされるのは GET リクエストのみであり、RESTful アプリケーションでは制限が生じます。代わりに、バックエンドで Cross-Origin Resource Sharing (CORS) を使用してクロスオリジン リクエストを処理できます。このソリューションは Spring Boot に固有のものではなく、従来の SSM フレームワークで使用されてきました。これを構成するには、WebMvcConfigurer インターフェイスを実装し、addCorsMappings メソッドをオーバーライドします。
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } }
@CrossOrigin アノテーションを @RequestMapping アノテーションに追加することで、特定のコントローラー メソッドに対して CORS を有効にできます。デフォルトでは、@CrossOrigin は @RequestMapping で指定されたすべてのオリジンと HTTP メソッドを許可します。
@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }
@CrossOrigin パラメータについて:
例:
@CrossOrigin @RestController public class PersonController { @RequestMapping(method = RequestMethod.GET) public String add() { // some code } }
以上がSpring Boot: クロスオリジンの問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。