似たようなものがすでに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が表示されません。
JavaScriptを使用してCORSリクエストでCookieを設定または読み取ることはできません。 CORSはクロスオリジンリクエストを許可しますが、Cookieは引き続きブラウザーの同一オリジンポリシーの対象となります。つまり、同じオリジンのページのみがCookieを読み書きできます。 withCredentials
は、リモートホストによって設定されたすべてのCookieがそのリモートホストに送信されることのみを意味します。 Set-Cookie
ヘッダーを使用して、リモートサーバーからCookieを設定する必要があります。
一般的にこれは悪い習慣であるため、これはクッキー共有プロセスを解決しないことに注意してください。
タイプとして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);
}
}
);
同じ問題がありました。セッションIDはCookieで送信されますが、リクエストはクロスドメインであるため、ブラウザのセキュリティ設定によりCookieの送信がブロックされます。
Solution:クライアント(ブラウザ)でセッションIDを生成し、Javascript sessionStorageを使用してセッションIDを保存し、各リクエストでセッションIDをサーバーに送信します。
私はこの問題に苦労しましたが、良い答えはあまりありませんでした。ソリューションの詳細を示す記事は次のとおりです: Javascript Cross-Domain Request With Session