我是新使用Express和Connect,所以我希望我做一些愚蠢的,有一個簡單的解決方案...如何在交叉源請求中保留會話數據?
基本上,我有一個頁面,用戶使用Persona登錄。要驗證身份驗證嘗試,我使用express-persona。假設該模塊將用戶驗證的電子郵件地址保存在會話變量(默認爲req.session.email)中。
現在,登錄後,用戶可以發表評論,此評論將與用戶登錄的電子郵件地址一起保存。當服務該表單的服務器與處理該表單的服務器相同時張貼評論,這工作正常。然而,當它們不同時(假設用戶填寫表格http://localhost:8001
,而瀏覽器然後發送POST請求http://localhost:8000
應保存評論),突然req.session.email值爲undefined
。
我認爲我正確設置了跨源資源共享。形式發送正是如此(使用jQuery):
$.ajax('http://localhost:8000/post/comment',
{
data: {comment: $('#commentField').val()},
type: 'POST',
xhrFields: {withCredentials: true}
}
);
(注意xhrField: {withCredentials: true}
- 會話cookie被傳承下去,這是我通過檢查網絡請求驗證)
服務器設置的(我認爲)正確的CORS頭:
res.header('Access-Control-Allow-Origin', 'http://localhost:8001');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
res.header('Access-Control-Allow-Credentials', 'true');
當我添加console.log(req.cookie)
,我看到sessionId
的cookie具有相同的值作爲一個與POST請求一起發送。
但是:console.log(req.session.email)
顯示undefined
對跨域請求 - 再次,當請求來自同一產地,它工作正常。
我在做什麼錯?
您要在哪裏放置console.log語句?你的Express .use()語句是什麼樣的?在express-pesona中間件有機會運行並更新會話信息之前,您是否正在運行console.log? – monsur
console.log()位於Express應用程序中,在使用()腳本和註釋處理模塊之後調用 - 當請求來自同一個源時,它們輸出正確的值。 – Vincent