簡體   English   中英

瀏覽器在使用CORS XHR時不發送cookie

[英]Browsers not sending back cookies when using CORS XHR

編輯 - 使用Chrome網絡檢查器查看Cookie,似乎無論Cookie的過期價值是什么,瀏覽器都會將其設置為會話Cookie並根據請求刪除它。

我正在使用Node.js和Express為我正在教授的課程構建一個CORS示例。

但是,盡管從服務器設置了cookie,但它們不會在以下請求中發送回服務器。 這幾乎意味着我不能使用任何簡單的會話管理器。

知道我在這里缺少什么嗎? 為什么瀏覽器不將域設置的cookie發送回該域? 這不應該自動發生嗎?

編輯 - 一些代碼示例:設置XHR請求:

var xhr = new XMLHttpRequest();

xhr.open(method, url, true);
xhr.widthCredentials = true;

xhr.onreadystatechange = function(res){
    if (xhr.readyState == 4){
        cb(res,xhr);
    }
};

xhr.setRequestHeader("Content-Type",'application/json');

xhr.setRequestHeader('Accept','application/json');

xhr.send(JSON.encode({param:some_param})); 

服務器:

function allowCrossDomain(req,res,next) {  
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Origin', req.headers.origin);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type,Accept,X-Requested-With');

    if (req.method!='OPTIONS') return next();

    res.send(204);
}                 

//while configuring express
app.use(allowCrossDomain)

還值得一提的是,我嘗試過各種npm中間件,這些中間件做同樣的事情沒有可觀察到的差異

至於場景:

  1. 使用XHR發出CORS請求
  2. 服務器設置一個cookie,正在成功發送回客戶端(快速會話cookie)
  3. 下一個XHR請求不會將該cookie發送回服務器,因此express無法識別用戶,因此會創建新的會話cookie等等。

除了我讀過的內容之外,我對此一無所知,但根據MDN文檔 ,XHR對象上有一個“withCredentials”屬性,需要設置:

xhr.withCredentials = true;

默認情況下,它是false 如果未設置該標志,則不會傳輸cookie,並且會忽略響應中的cookie標頭。

編輯 - 我發誓我幾次讀了你的問題,但我完全錯過了你提到的旗幟。 抱歉。 但是,因為這不是一個完全浪費,我還要提到您的服務器需要在響應頭中將“Access-Control-Allow-Credentials”標志設置為true ,並且“Access-Control-Allow-” Origin“設置為您當前的協議+主機+端口。

件事發生在我之前,我可以說它非常愚蠢。

如果您使用的是虛擬機,通常會在需要時將其暫停/恢復。

這意味着與主機或您正在使用的任何客戶端相比,虛擬機的日期通常晚了幾天(或更長)。

因此,當服務器設置cookie過期日期(通常在當前日期之后幾個小時)時,它已在客戶端上過期。 因此,客戶不保留它。

要更新虛擬機上的日期,我建議您只使用ntpdate ,或者您可以手動設置日期以查看是否存在問題:

# what's the date?
date
# You'll see if it's the problem already

# If it is, here is how to manually set it
date -set 2012-07-22 # yyyy-mm-dd
date -set 17:00:42 # hh:mm:ss

我剛遇到這個問題,我的解決方案就是添加cookie的路徑,所以在添加cookie時你必須使用:

document.cookie = 'cookieName=cookieValue;path=/';

這樣瀏覽器就可以在新請求中發送cookie。

PS:你還需要xhr.withCredentials = true; 如果您使用跨域請求。

我遇到了類似的問題,結果發現瀏覽器設置阻止了第三方Cookie(Chrome>設置>高級設置>隱私>內容設置>阻止第三方Cookie和網站數據)。 解鎖解決了這個問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM