次のエラー メッセージが表示される場合があります:
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 | クロスオリジン | 理由 |
---|---|---|
https://www.baidu.com/more/index.html | いいえ | 同じプロトコル、ドメイン、ポート |
https://map.baidu.com/ | はい | 異なるドメイン |
http://www.baidu.com/index.html | はい | 異なるプロトコル |
https://www.baidu.com:81/index.html | はい | 異なるポート |
同一オリジン ポリシーは、ブラウザの基本的なセキュリティ機能です。これがないと、ブラウザの通常の機能が危険にさらされる可能性があります。 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 } }
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3