CORSドメイン間の詳細な問題

1511 ワード

フロントエンドでajaxのドメイン間リクエストを処理する方法はほとんどよく知られていますが、実装時には詳細に注意する必要があります.例えば、Webサーバが返す応答ヘッダにCORSを追加する方法:
Access-Control-Allow-Origin:*

以前、システム内のマイクロサービスがc++を使用して提供されていたプロジェクトに出会ったことがあります.当時、c++の一部を担当していた学生はhttpリクエストに応答するインタフェースを簡単に作り、responseの時に上のheaderを追加しました.そしてurlとパラメータを約束し、フロントエンドの学生は直接jqueryを出してajaxリクエストを開始します.しかし、テストの結果はおかしく、リクエストはデータの取得に成功しませんでした.ネットワーク・メッセージを表示すると、ajaxリクエスト・コールが呼び出されると、optionタイプのリクエストがブロックされ、失敗が返されます.その後、こつこつと研究(bai)を経て、以下の説明を見つけた.
Simple requests

A simple cross-site request is one that meets all the following conditions:

The only allowed methods are:
GET
HEAD
POST
Apart from the headers set automatically by the user agent (e.g. Connection, User-Agent, etc.), the only headers which are allowed to be manually set are:
Accept
Accept-Language
Content-Language
Content-Type
The only allowed values for the Content-Type header are:
application/x-www-form-urlencoded
multipart/form-data
text/plain

簡単に言えば、ブラウザは、ドメイン間リクエストの場合、現在送信されているのが「単純リクエスト」か「複雑リクエスト」かを判断し、複雑リクエストの場合、ブラウザはまずoptionリクエストを送信して、サーバがドメイン間アクセスを許可するかどうかを検出します.最下位のウェブサービスの実装では,このような状況はまったく考慮されず,基本的なpost,getタイプのリクエスト,すなわち「単純なリクエスト」しか処理できない.
フロントエンドajaxリクエストが送信するコードは、他のモジュールを直接多重化します.デフォルトではrequest headerに設定されている「Content-Type:application/json」ですが、上記の「単純リクエスト」の条件と比較すると、このheader設定後にリクエストが瞬時に簡単にならなくなったことがわかります^0^.
解決策は簡単で、要求パラメータを直接「Content-Type:application/x-www-form-urlencoded」テストに変更すれば、正常に戻ることができます.
転載は出典(http://www.qintianxiang.com/archives/254/)