あるサイトにログインした後$.ajax()
、そのサイトに 2 番目のリクエストを送信しようとしています$.ajax()
が、FireBug を使用して送信されたヘッダーを確認すると、リクエストにセッション クッキーが含まれていないことがわかります。
何が間違っているのでしょうか?
ベストアンサー1
私はクロスドメイン シナリオで操作しています。ログイン中に、リモート サーバーは Set-Cookie ヘッダーをAccess-Control-Allow-Credentials
true に設定して返します。
リモート サーバーへの次の Ajax 呼び出しでは、この Cookie を使用する必要があります。
CORSはAccess-Control-Allow-Credentials
クロスドメインのログ記録を可能にするためにあります。https://developer.mozilla.org/En/HTTP_access_controlたとえば。
私にとっては、これは JQuery のバグ (または少なくとも次のバージョンで予定されている機能) のように思えます。
アップデート:
AJAX レスポンスから Cookie が自動的に設定されることはありません (引用:http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/)
なぜ?
レスポンスからクッキーの値を取得して手動で設定することはできません(http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-getresponseheader)
私は混乱しています..
jquery.ajax()
パラメータの設定を要求する方法が存在するはずですXMLHttpRequest.withCredentials = "true"
。
答え:xhrFields
パラメータを使用する必要があります参考:
ドキュメント内の例は次のとおりです。
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
サーバーがこの要求に正しく応答することも重要です。@Frédéric と @Pebbl からの素晴らしいコメントをここにコピーします:
Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *
したがって、リクエストが次の場合:
Origin: http://foo.example
Cookie: pageAccess=2
サーバーは次のように応答します:
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Credentials: true
[payload]
そうしないと、ペイロードはスクリプトに返されません。参照:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials