我有以下代码在Express中创建会话。
app.use(session({
secret: 'randomstring',
saveUninitialized: false,
resave: false,
cookie: {
secure: true,
maxAge: 60000 * 60 /* 1 hour */
}
}));我主要用它来存储Passport.js中的会话数据。目前,在1小时后,用户将自动注销。或者会话结束,用户将被注销。
是否有一种简单的方法可以在会话中存储更多的数据,并对不同的信息具有不同的过期日期?因此,假设我希望Passport.js (req.session.passport.user)会话数据过期1小时。我想要另一份数据,比如说,(req.session.myDataA)的有效期是30天。我希望另一段数据(req.session.myDataB)没有过期,并且永远保持活动状态。
在Express会话中是否有实现此行为的简单方法?
发布于 2017-10-27 22:55:28
您可以使用cookie,并在不同的cookie名称上设置不同的到期时间。因此,您可以拥有多个保存数据的cookie,并且每个cookie都有特定的过期时间。
尽管如此,我要说的是,无论是会话还是cookie,都不是解决问题的正确方法。我会让你的会议精益求精,并将数据存储在数据库中。考虑到您使用的会话,您可以使用Redis和存储数据的呼气。您可以将Redis中的密钥分配给您的会话。例如:
req.session.myDataA = 'user_id:myDataA'
req.session.myDataB = 'user_id:myDataB'使用Redis设置数据时,可以使用键user_id:myDataA并将其设置为过期。
// Will expire in 1 hour
SET user_id:myDataA "your data"
EXPIRE user_id:myDataA 3600虽然键仍在会话中,但您可以检查该值是否为null,或者是否具有您所期望的数据。
我知道这听起来可能有点复杂,但即使作为会话的良好实践,您也不想存储大量数据,而不是引用键,因为管理起来非常困难。
如果使用的是MongoDB,也可以将文档设置为过期。但是,如果您没有使用任何一个,Redis通常都是最容易设置的,并且是一个很好的会话存储。
编辑:
正如下面所评论的,与其在不同的时间范围内终止会话,不如在数据中设置一个带过期时间的字段。然后,当您获得该数据时,检查它是否已过期(例如,1小时、30天等)。
发布于 2017-10-29 18:45:23
您可以在另一个中间件中设置会话的maxAge。
代码:
// after session and passport middleware
app.use(function(req, res, next) {
if (req.session.user) { // some condition
req.session.cookie.maxAge = 1000 * 60 * 60 * 24 // 24 hours
} else if (req.session.myData) {
req.session.cookie.maxAge = 1000 * 60 * 60
}
// another condition
// save the session
req.session.save()
// add next at the end of middleware
// so it can pas data edited to another middleware
next()
})https://stackoverflow.com/questions/46878869
复制相似问题