首页 文章

快递会话不同期满

提问于
浏览
2

我有以下代码在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

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

  • 2

    您可以在另一个中间件中设置会话的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()
    })
    

相关问题