快递会话不同期满

时间:2017-10-22 20:30:31

标签: javascript node.js session express cookies

我有以下代码在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 Sessions中有一种简单的方法可以实现这种行为吗?

2 个答案:

答案 0 :(得分:2)

您可以使用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天等)。

答案 1 :(得分:0)

您可以在另一个中间件

中设置会话的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()
})