jQuery の .ajax() メソッドがセッション クッキーを送信しないのはなぜですか? 質問する

jQuery の .ajax() メソッドがセッション クッキーを送信しないのはなぜですか? 質問する

あるサイトにログインした後$.ajax()、そのサイトに 2 番目のリクエストを送信しようとしています$.ajax()が、FireBug を使用して送信されたヘッダーを確認すると、リクエストにセッション クッキーが含まれていないことがわかります。

何が間違っているのでしょうか?

ベストアンサー1

私はクロスドメイン シナリオで操作しています。ログイン中に、リモート サーバーは Set-Cookie ヘッダーをAccess-Control-Allow-Credentialstrue に設定して返します。

リモート サーバーへの次の Ajax 呼び出しでは、この Cookie を使用する必要があります。

CORSはAccess-Control-Allow-Credentialsクロスドメインのログ記録を可能にするためにあります。https://developer.mozilla.org/En/HTTP_access_controlたとえば。

私にとっては、これは JQuery のバグ (または少なくとも次のバージョンで予定されている機能) のように思えます。

アップデート:

  1. AJAX レスポンスから Cookie が自動的に設定されることはありません (引用:http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/

    なぜ?

  2. レスポンスからクッキーの値を取得して手動で設定することはできません(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

おすすめ記事