我使用 NodeJSexpress-session并將會話資訊存盤在資料庫上,每個
我只想在創建帳戶或登錄后存盤 cookie,用戶同意 cookie 政策,而不是在公共頁面上,以避免 GDPR 要求的“cookie 同意框”。
如何僅在瀏覽器登錄后存盤 cookie?
更新
我按照答案中的建議洗掉了兩個cookie。我停止服務器,清除localhostcookie,啟動服務器,發出公共頁面請求,但我仍然在公共頁面上有一個 cookie。這是服務器資料庫上的會話資料:
> db.sessions.find().pretty()
{
"_id" : "DObp-FFNJGLD5c5kLKWfkCaEhfWHtWpo",
"expires" : ISODate("2022-03-03T19:41:29.807Z"),
"session" : {
"cookie" : {
"originalMaxAge" : 7776000000,
"expires" : ISODate("2022-03-03T19:41:29.807Z"),
"secure" : null,
"httpOnly" : true,
"domain" : null,
"path" : "/",
"sameSite" : null
},
"flash" : {
}
}
}
并且瀏覽器顯示此 cookie:

當我PassportJS從應用程式中洗掉和設定sameSite為"strict".
第二次更新
由于資料庫會話有一個空flash欄位,我懷疑這是由于閃存訊息。我洗掉了這段代碼:
const flash = require("express-flash");
app.use(flash());
現在服務器不存盤用于訪問公共頁面的 cookie。我在登錄用戶和公共頁面訪問者的通知中使用 Flash 訊息,例如當頁面不再可用時。
所以問題就變成了:是否可以只在服務器端使用 flash 訊息,從一個處理程式到另一個處理程式,而不存盤 cookie?
uj5u.com熱心網友回復:
離開檔案,saveUninitialized標志應該設定為false-
強制將“未初始化”的會話保存到存盤中。當會話是新的但未被修改時,它是未初始化的。選擇 false 對于實作登錄會話、減少服務器存盤使用或遵守在設定 cookie 之前需要許可的法律很有用。選擇 false 也有助于解決客戶端在沒有會話的情況下發出多個并行請求的競爭條件。默認值為 true,但不推薦使用默認值,因為默認值將來會更改。請研究此設定并選擇適合您的用例的設定。
https://github.com/expressjs/session#saveuninitialized
uj5u.com熱心網友回復:
在創建靜態頁面路由后配置您app.use()的 cookie/會話。Express 按照中間件和路由的宣告順序對其進行評估。
基本上這樣做:
// Create express app
// Declare app.use(express.static) routes
// Declare app.use(cookie) and app.use(session) routes
// Declare routes that need to use cookies/sessions
因為在這種情況下,靜態內容路由是在 cookie/會話中間件之前宣告的,所以 cookie 中間件不會應用于靜態路由。
如果您的路由結構比這更復雜,我建議您將會話邏輯設定為可以從專用檔案 (middlware.js?) 匯出的中間件功能。然后,您可以要求它并根據需要在特定路由器內添加 cookie/會話中間件(在該路由器中宣告任何靜態路徑之后)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/381787.html
