[英]Cross domain POST request is not sending cookie Ajax Jquery
似乎已經在 stackoverflow 上討論了類似的內容,但我找不到完全相同的內容。
我正在嘗試使用 CORS(跨源資源共享)發送 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);
}
}
);
我在請求 HEADER 中沒有看到這個 cookie。
您無法通過 JavaScript 在 CORS 請求上設置或讀取 cookie。 盡管 CORS 允許跨域請求,但 cookie 仍受瀏覽器的同源策略約束,這意味着只有來自同一源的頁面才能讀取/寫入 cookie。 withCredentials
僅意味着遠程主機設置的任何 cookie 都會發送到該遠程主機。 您必須使用Set-Cookie
標頭從遠程服務器Set-Cookie
。
請注意,這並不能解決 cookie 共享過程,因為通常這是不好的做法。
您需要使用 JSONP 作為您的類型:
來自 $.ajax 文檔:跨域請求和數據類型:“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);
}
}
);
這個領域最近發生了許多變化,所以我認為一個新的答案會有所幫助。
要在請求期間讓瀏覽器將 cookie 發送到另一個站點,必須滿足以下條件:
Set-Cookie
標頭必須包含SameSite=None
和Secure
標簽。 如果未使用Secure
, SameSite
忽略SameSite
標頭。https
端點發出請求,這是Secure
標志的要求。XHRRequest
必須使用withCredentials=true
。 如果使用$.ajax()
這是通過xhrFields
參數完成的(需要jQuery=1.5.1+
)Origin
標頭匹配的Access-Control-Allow-Origin
標頭進行響應。 ( *
在這種情況下不會被尊重)很多人找到了這篇文章的方法,試圖針對遠程端點進行本地開發,如果滿足上述條件,這是可能的。
我有同樣的問題。 會話 ID 在 cookie 中發送,但由於請求是跨域的,瀏覽器的安全設置將阻止發送 cookie。
解決方案:在客戶端(在瀏覽器中)生成會話 ID,使用 Javascript sessionStorage 存儲會話 ID,然后將會話 ID 與每個請求一起發送到服務器。
我在這個問題上掙扎了很多,周圍沒有很多好的答案。 這是一篇詳細介紹解決方案的文章: Javascript Cross-Domain Request With Session
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.