我目前正在研究一个新项目,并且我在快速会话库中使用会话。
这是我设置会话的代码:
const IN_PROD = process.env.MODE==='production'
app.use(session({
name: 'sid',
secret: 'asecret',
store: new MongoStore({
mongooseConnection: mongoose.connection,
collection: 'sessions'
}),
saveUninitialized: false,
resave: false,
cookie: {
sameSite: true,
secure: IN_PROD,
expires: new Date(new Date().getTime() + 1000 * 60 * 60 * 24)
}
}))
想象以下步骤:
1)我的服务器将cookie中的会话ID(sid = A)发送给我的客户端。
2)客户端手动删除cookie
3)在下一个请求时,客户端发送另一个会话ID(sid = B)
A和B cookie都存储在数据库中并且不覆盖第一个cookie是正常的吗?
是正常的。它取决于您或您用来清除较旧会话的会话存储。
如果您查看MongoStore()
文档,您会发现它具有与automatic removal of session objects相关的若干功能。
这里是一个例子:
// connect-mongo will take care of removing expired sessions, using defined interval.
app.use(session({
store: new MongoStore({
url: 'mongodb://localhost/test-app',
autoRemove: 'interval',
autoRemoveInterval: 10 // In minutes
})
}));
请记住,在快速会话级别,会话只是与cookie相关的数据的一滴。每当浏览器向您的服务器发出请求并且不存在会话cookie时,都会创建一个新的会话cookie并将新的express-session对象连接到该新cookie。
如果用户随后删除该cookie并再次连接到您的服务器,则express-session不知道此浏览器与上一个会话是同一浏览器。原始cookie是唯一可以知道的方法,并且cookie现在不见了。因此,express-session只会看到一个新的浏览器连接到没有会话cookie的服务器,因此它将创建一个新的cookie,然后创建一个新的会话对象。
已登录用户与快速会话的任何关联都在您的应用程序级别完成(通过将用户标识信息放入会话对象中,而快速会话完全不知道这一点。