抱歉,我對會話和 cookie 真的很陌生,我正在嘗試了解其背后的機制。我想將注冊/登錄添加到我的簡單網站,為此我需要了解網路身份驗證,我真的認為我會有很多關于這個主題的問題。
最初,我有注冊頁面,在單擊提交按鈕后使用 express 將資訊發送到節點服務器。我想看看會發生什么,所以我在 post 路由中創建了一個會話,它是在瀏覽器 (connect.sid) 中創建的,然后我注釋掉了創建該會話的部分,并嘗試重新顯示會話物件,但它是未定義的,但我仍然可以在瀏覽器的 cookie 部分看到會話,所以發生了什么?謝謝
app.use(session({
secret:"my test secret",
cookie:{},
resave:false,
saveUninitialized:false
}))
app.post("/register", (req, res) => {
req.session.usertest = "testsession_hardcodedvaluefornow";
console.log(req.session.usertest); // -> this is okay when above line to create is uncommented
//but when I comment the session assignment, it becomes undefined?
res.send("In register...");
})
即使在注釋掉創建會話并一遍又一遍地發布之后,我仍然可以看到會話 cookie。
connect.sid s:_TahsTv0xhY-iHIdjDRblYJ_aZZ5oiSd.do7JcOGR1FaXPcFFIQ6hg5AW+0XVsYwIRO8vndyjDzs
即使我在瀏覽器中洗掉了我的會話,req.session.id 也會產生一個不同的值(不是未定義的),所以不確定它來自哪里。
uj5u.com熱心網友回復:
會話物件中沒有“usertest”鍵,因此它是未定義的。當您取消注釋該行時它不是未定義的原因是因為您在該行的那一刻自己創建了該鍵。
您可以使用 req.session 獲取整個會話物件,使用 req.session.id 獲取會話 id,使用 req.session.cookie 獲取會話 cookie。
編輯
進一步澄清:將為每個連接的客戶端創建一個會話。這就是為什么您可以在瀏覽器中看到 cookie。然而,這沒有任何意義,它只是唯一標識該客戶的一種方式(實際上并沒有告訴您該客戶是誰)。有關該會話的任何資訊(是否已登錄、用戶 ID 等)都需要存盤在會話存盤中。默認情況下,Express-session 將使用記憶體存盤,如果服務器重新啟動,所有資訊都將丟失,這就是該密鑰不存在的原因。為了保留該資訊,它必須存盤在持久會話存盤中。有關 express-session 的會話存盤實作以及如何使用它們的更多資訊,請訪問:https : //www.npmjs.com/package/express-session
至于你得到的 cookie 值,這些是 express-session 設定的默認值,因為你自己沒有設定任何值。您可以更改 maxAge 以使其過期(或將其設定為 10 年或更長時間以獲得更持久的會話),您可以指定該 cookie 所屬的域,您可以將其設定為安全(僅允許它通過安全連接,例如 https) 和 httpOpnly 默認為 true。客戶端無法訪問/更改 httpOnly cookie(盡管您可以在瀏覽器中看到它們),請勿將其設定為 false。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376150.html
上一篇:帶會話的SQL查詢
下一篇:排序和取消排序功能
