CORSの問題をデバッグしているうちに、次のような現象が発生しました。以下の場合CORSのプリフライト要求が標準ヘッダーのために失敗しました
curl -v 'https://www.example.com/api/v1/users' -X OPTIONS -H 'Access-Control-Request-Method: POST' -H 'Origin: http://example.com' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: es-ES,es;q=0.8,en;q=0.6' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36' -H 'Accept: */*' -H 'Referer: http://example.com/users/new' -H 'Connection: keep-alive' -H 'Access-Control-Request-Headers: accept, x-api-key, content-type'
この要求に対するサーバからの応答:クロム(クロム単独でCURLで書き換え)以下のオプションプリフライト要求を行う
< HTTP/1.1 403 Forbidden
< Date: Thu, 21 Jul 2016 14:16:56 GMT
* Server Apache/2.4.7 (Ubuntu) is not blacklisted
< Server: Apache/2.4.7 (Ubuntu)
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< Strict-Transport-Security: max-age=31536000 ; includeSubDomains
< X-Frame-Options: SAMEORIGIN
< Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
< Content-Length: 20
< Keep-Alive: timeout=5, max=100
< Connection: Keep-Alive
応答「無効の本体でありますCORSの要求です。私は、ヘッダを削除要求「アクセス制御リクエスト・メソッド」(とのみそのヘッダ)を繰り返すとOPTIONS要求は、次のREPONSEに成功:
< HTTP/1.1 200 OK
< Date: Thu, 21 Jul 2016 14:21:27 GMT
* Server Apache/2.4.7 (Ubuntu) is not blacklisted
< Server: Apache/2.4.7 (Ubuntu)
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< Strict-Transport-Security: max-age=31536000 ; includeSubDomains
< X-Frame-Options: SAMEORIGIN
< Access-Control-Allow-Headers: origin, content-type, accept, x-requested-with, x-api-key
< Access-Control-Max-Age: 60
< Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
< Access-Control-Allow-Origin: *
< Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
< Content-Length: 0
< Keep-Alive: timeout=5, max=100
< Connection: Keep-Alive
はしかし、問題のヘッダはとてもそれが必要CORS spec standard headerです要求が成功するのを防ぐのではないでしょうか?このヘッダがこのような動作を引き起こすのはなぜですか?
また、Chromeで作成したリクエストを動作させるためにサーバーから送信されたアクセス制御ヘッダーを調整するにはどうすればよいですか?
ところで、私はChrome 36.0を使用していますが、サーバーはSpringブートを使用しており、CORSヘッダーはSpringによって管理されています。
Firefox(v47.0)でリクエストが行われた場合、動作は異なりますが、アナログ結果が表示されます。 Firefoxはプリフライトリクエストを送信しなくても、POSTリクエストを直接送信します。これは応答として403 Forbiddenを受け取ります。ただし、「cURLとしてコピー」オプションを使用して要求をコピーし、端末ウィンドウからそれを繰り返すと、応答に正しいCORSヘッダーが送信されます。
任意のアイデア?
更新:Firefoxは(プラグインライブHTTPヘッダによって示されるように)プリフライトOPTIONS要求を送信しますが、Firebugのマスク、それを、その両方のブラウザでの動作もまったく同じん。どちらのブラウザーでも、「Access-control-request-method」ヘッダーが要求を失敗させます。
限り、あなたのSecurityConfigurationクラスでCORS() yはApacheで設定した場合、通常のCORS処理を中断します。 CorsFilterを設定するか、ここのアドバイスに従うかのように見えます - https://spring.io/guides/gs/rest-service-cors/ – chrismarx
この投稿は参考になりました:http://stackoverflow.com /質問/ 9521690 /ハウツーハンドル-HTTP-オプション-とスプリング-MVC DispatchServletは、オプションの要求に沿って通過するように構成する必要があり、そうでなければ、マップされた要求に達することはありません:< ... をサーブレット名> yourServletサーブレット名> ののorg.springframework.web.servlet.DispatcherServletサーブレットクラス> dispatchOptionsRequest true param-value> 1 load-on-startup> ... –
Mike