【问题标题】:Node/Express with connect-redis, how handle session expiryNode/Express 与 connect-redis,如何处理会话到期
【发布时间】:2016-12-07 20:22:56
【问题描述】:

我有一个使用 redis 作为会话存储的 Node/Express 应用程序。

我有一个关于处理会话到期的问题。

我希望在浏览器关闭之前有一个活动会话,所以我没有设置会话过期时间。

这样做会话 cookie 工作正常,但我对 Redis 有疑问。

似乎Redis DB中存储的一对Key/Value永远不会过期。

如何正确处理这个问题?

有没有办法配置redis销毁一个存储有一定空闲时间的值?

或者在应用程序内部调用connect-redis时最好设置一个TTL?


应用内部会话的实际配置:

var session = require('express-session');
var RedisStore = require('connect-redis')(session);

app.use(session({
  store: new RedisStore({port:6379, host: 'localhost'}),
  secret: "my-secret-here",
  resave: false,
  saveUninitialized: true }));

【问题讨论】:

    标签: node.js express redis node-redis express-session


    【解决方案1】:

    将 Redis 与 express-session 一起使用,您可以使用 express-session 中的 touch() 方法来重置 TTL。因此,如果您在创建会话时设置了 TTL,请在您不希望会话过期的路由上执行以下操作:

    api.get("/someRoute/", (req, res) => {
      req.session.touch();
    
      // Whatever else you need to do
      res.sendStatus(200);
    }
    

    这将重置 Redis 上的 TTL 并防止会话过期(假设客户端仍在访问您的 API)——我假设如果客户端没有与您的 API 交互足够长的时间,这意味着浏览器已关闭或以其他方式使用完您的应用。

    【讨论】:

    • 方法touch()设置cookie.maxAge?但是会话 cookie 没有设置 maxAge。 cookie 在浏览器关闭时过期。也许我可以为存储在 Redis DB 中的数据设置一个 TTL,并使用类似 store.touch() 的东西来刷新 TTL。这可能是正确的?
    • 我尝试设置 Redis TTL 值,您建议的命令 req.session.touch() 工作正常。它刷新存储在 Redis DB 中的密钥的空闲时间。非常感谢。
    【解决方案2】:

    您可以在创建会话存储时指定 ttl。 您可以在readme 中找到更多选项。

    app.use(session({
        store: new RedisStore(options),
        secret: 'keyboard cat',
        ttl : 20 // ttl is in seconds. From the readme.
    }));
    

    【讨论】:

    • 是的,我喜欢这样。我真的不知道合适的时间,但我会尝试不同的值。如何重置 TTL?我必须按照 Levi 的建议使用 req.session.touch() 或类似 store.touch() 的东西?我不明白。
    • 你可以使用 touch 或者只是设置一个 ttl 并忘记它。
    猜你喜欢
    • 2014-04-11
    • 2012-08-03
    • 2012-08-02
    • 1970-01-01
    • 2012-09-09
    • 2014-01-25
    • 1970-01-01
    • 2017-10-09
    • 2013-03-11
    相关资源
    最近更新 更多