47

これが以前にさまざまな形で尋ねられたことは知っていますが、問題を回避できないようです。jQuery とネイティブ JS API の両方を使用して Ajax リクエストを作成しようとしました。

私の状況は次のとおりです(添付の図を参照):

  1. ブラウザが HTTP リクエストを行う
  2. サーバーが応答し、永続的な Cookie を設定します
  3. ブラウザは HTTP Ajax リクエストを行います。Cookie は問題ありません
  4. サーバーは期待どおりに応答し、Cookie を更新します
  5. ブラウザが HTTPS Ajax リクエストを行い、Cookie がなくなった (?!)
  6. Cookie がないため、サーバーは「デフォルト」の応答を返します (意図しない動作)。

クロスドメイン リクエストに関する講義を始める前に、いくつかのことを述べさせてください。

  • これがクロスドメイン リクエスト (異なるプロトコル) であることはわかっています。そのため、サーバーはレスポンスにヘッダーを設定します(そして、 CORSAccess-Control-Allow-Originをサポートする Chrome と Firefox を使用しています) 。
  • ただし、ホストが同じであるため、HTTP cookie は HTTPS 経由で管理できる必要があることも知っています (こちらを参照)。
  • (編集) Cookie は一般的なドメイン (.domain.ext など) に対して適切に設定されており、HttpOnly フラグも Secure フラグも設定されていません。

では、HTTPS Ajax 呼び出しを行うときにブラウザーが Cookie を渡さないのはなぜでしょうか? 何か案は?正気を失いそう…

     +-----------+ HTTP Request     +-----------+
     |Browser    |+---------------->|Server     |
     +-----------+                  +-----------+

                   HTTP Response
                  <----------------+
                   Set-cookie

                   Ajax HTTP Req.
                  +---------------->
                   Cookie (OK)

                   HTTP Response
                  <----------------+
                   Set-cookie (OK)

                   Ajax HTTPS Req.
                  +---------------->
                   No Cookie (!!!)
4

2 に答える 2

78

OK、Cookieの問題の解決策を見つけました。

XHR仕様jQueryドキュメントStackOverflowをご覧ください。

プロトコルやサブドメインを切り替えるときにCookieを送信するための解決策は、withCredentialsプロパティをに設定することtrueです。

例(jQueryを使用)

 $.ajax( {
   /* Setup the call */
   xhrFields: {
     withCredentials: true
   }
 });
于 2012-04-20T15:31:44.410 に答える