【问题标题】:Expire time express and redis session过期时间 express 和 redis 会话
【发布时间】:2017-10-09 10:11:47
【问题描述】:

我正在使用 express 和 redis 使会话在我的系统上保持实时。我在 sessionCookie 上设置 maxAge 时遇到了一些问题。默认情况下,我读的是 24 小时,但要让它保持运行时间很长。我想设置 30 分钟然后注销用户,我更改了 1 分钟以查看它是否有效但没有任何反应,用户仍然登录。

这是我的会话函数:

module.exports.initSession = function(app, db) {
  app.use(session({
    saveUninitialized: true,
    resave: false,
    secret: config.sessionSecret,
    cookie: {
      maxAge: 30*10000,
      httpOnly: true,
      secure: Boolean(process.env.ssl) || true
    },
    key: config.sessionKey,
    store: new RedisStore({
      host: config.redis.host || 'localhost',
      port: config.redis.port || 6379,
      db: config.redis.database || 0,
      pass: config.redis.password || ''
    })
  }));
};

我也尝试使用 ttl 而不是 maxAge,但我得到了相同的结果。会是什么?

已编辑:

我使用SEAN.JS 和内容会话的文件是这两个: express.jsdefault 环境。

【问题讨论】:

  • 如果你希望它是 30 分钟,你必须将它设置为 1000*60*30,而不是 10000*30 = 5 分钟。另外,我不确定,但我认为如果你想使用基于 cookie 的会话,你必须在设置会话之前初始化 cookie 解析器 var cookieParser = require('cookie-parser'); app.use(cookieParser())
  • @FluffyNights cookie-parser 不再需要,see the notes
  • 我编辑了我的问题,向您展示我正在使用的框架
  • 只要会话在请求期间被修改,它就不会过期。 maxAge 值基本上用于 idle 计时器:如果会话在maxAge 毫秒内根本没有被修改,则会话将过期。因此,如果您正在重新加载等待到期的页面,则会话可能每次都会更新并且计时器会重置。
  • @robertklep 但是,如果我关闭选项卡并等待时间过去,会话仍然存在,我不知道我没有为此做些什么正常工作。 ://

标签: node.js session express redis


【解决方案1】:

cookie: {maxAge: 5000} 将在 5 秒后过期客户端的 cookie,而不是存储在 REDIS 中的会话。 如果您想使 RedisStore 中的会话过期,请使用 ttl 选项,如提到的Ali Sherafat

【讨论】:

    【解决方案2】:

    这是我的会话配置,它有效。
    出于测试目的,我将过期时间设置为 5 秒。

    app.use(session({
            store: new redisStore({
            host: 'localhost',
            port: 6379,
            client: redisClient,
            ttl: 5 // in seconds
        }),
        secret: 'this is secret',
        resave: false,
        saveUninitialized: true,
        // cookie: {maxAge: 5000}
    }));
    

    我设置了maxAge,但它不起作用,当我设置ttl 时它起作用了。

    注意:我测试发现ttl 以秒为单位,而maxAge 以毫秒为单位! (有点奇怪)

    您可以使用如下中间件记录会话数据,以查看护照对象是否存在,如果会话数据中没有护照对象,则用户已注销。

    app.use((req, res, next) => {
        console.log('session:\n', req.session);
        next();
    });
    

    【讨论】:

    • 我实际上有 cookie : {maxAge: } 并且工作方式与您使用 ttl 的方式相同。会话过期,但它一直在系统上登录,我必须手动注销。
    • @Elebkey 你确定你正确处理登录系统吗?我使用passport,它可以工作。使用中间件记录所有会话数据,以查看会话中是否存在身份验证日期。
    • 这就是序列化在 Sean 堆栈上的工作方式 [这里] (github.com/seanjs-stack/seanjs/blob/master/modules/users/server/…)
    • 没关系,尝试记录所有会话数据,看看会话中是否存在护照对象,如果存在,则您没有注销。并删除cookie : {maxAge: } 并将ttl 设置为3 秒之类的小数字,看看它是否有效并从会话数据中删除护照对象。
    猜你喜欢
    • 2014-01-25
    • 2013-03-11
    • 2012-08-03
    • 2013-05-20
    • 2016-12-07
    • 2013-12-13
    • 2013-12-26
    • 2018-07-29
    • 2012-04-28
    相关资源
    最近更新 更多