web-dev-qa-db-ja.com

クロスドメインPOSTリクエストはCookie Ajax Jqueryを送信していません

似たようなものがすでにstackoverflowで議論されているようですが、私はまったく同じを見つけることができませんでした。

CORS(Cross-Origin resource sharing)でCookieを送信しようとしていますが、機能していません。

これは私のコードです。

$.ajax(
    { 
      type: "POST",
      url: "http://example.com/api/getlist.json",
      dataType: 'json',
      xhrFields: {
           withCredentials: true
      },
      crossDomain: true,
      beforeSend: function(xhr) {
            xhr.setRequestHeader("Cookie", "session=xxxyyyzzz");
      },
      success: function(){
           alert('success');
      },
      error: function (xhr) {
             alert(xhr.responseText);
      }
    }
);

リクエストヘッダーにこのCookieが表示されません。

57
Kirill Reva

JavaScriptを使用してCORSリクエストでCookieを設定または読み取ることはできません。 CORSはクロスオリジンリクエストを許可しますが、Cookieは引き続きブラウザーの同一オリジンポリシーの対象となります。つまり、同じオリジンのページのみがCookieを読み書きできます。 withCredentialsは、リモートホストによって設定されたすべてのCookieがそのリモートホストに送信されることのみを意味します。 Set-Cookieヘッダーを使用して、リモートサーバーからCookieを設定する必要があります。

62
monsur

一般的にこれは悪い習慣であるため、これはクッキー共有プロセスを解決しないことに注意してください。

タイプとしてJSONPを使用する必要があります。

$ .ajaxドキュメントから:クロスドメインリクエストとdataType: "jsonp"リクエストは同期操作をサポートしていません。

$.ajax(
    { 
      type: "POST",
      url: "http://example.com/api/getlist.json",
      dataType: 'jsonp',
      xhrFields: {
           withCredentials: true
      },
      crossDomain: true,
      beforeSend: function(xhr) {
            xhr.setRequestHeader("Cookie", "session=xxxyyyzzz");
      },
      success: function(){
           alert('success');
      },
      error: function (xhr) {
             alert(xhr.responseText);
      }
    }
);
20
abc123

同じ問題がありました。セッションIDはCookieで送信されますが、リクエストはクロスドメインであるため、ブラウザのセキュリティ設定によりCookieの送信がブロックされます。

Solution:クライアント(ブラウザ)でセッションIDを生成し、Javascript sessionStorageを使用してセッションIDを保存し、各リクエストでセッションIDをサーバーに送信します。

私はこの問題に苦労しましたが、良い答えはあまりありませんでした。ソリューションの詳細を示す記事は次のとおりです: Javascript Cross-Domain Request With Session

6
PerKristian