【问题标题】:Node.js run function on session expiry Express & PassportNode.js 在会话到期 Express 和 Passport 上运行功能
【发布时间】:2014-05-20 11:47:06
【问题描述】:

我使用以下代码(使用 Express.js 和 Passport.js)设置了最大会话时间。

  app.use(express.session({
    cookie: {
      maxAge : 3600000
    }
  }));

如果会话过期(用于我的日志文件和分析),我想运行一个函数。类似这样的东西:

app.use(express.session.onExpiry(function(user){
        console.log('User session for ' + user + ' has expired.')
    });
);

【问题讨论】:

  • 虽然没有直接解决这个具体问题,my answer to this question 可能对您有所帮助。从阅读中您会注意到的一件事是,确实没有一个快速会话可以跟踪或过期。如果您使用 Redis 作为会话存储,如果有兴趣,this Q&A 应该是。
  • @barry-johnson 感谢您的评论。这是非常有见地的信息。我已经担心我必须保留自己的用户会话记录。如果我这样做了,我可能只使用一个简单的 js 对象(而不是 redis),因为此时我不太关心无状态。
  • 不客气。是的,如果您自己制作或扩展 MemoryStore,您可以很容易地将其添加到您的扫描和过期/删除过程中。如果您不处理可伸缩性需求,这将可以正常工作,但您将因节点重启而失去会话持久性(这可能比您预期的更频繁地发生)。您仍然可以使用 redis,但在您的服务器上只需维护一种并行数据结构(将其粘贴在一个中间件中),仅包含会话密钥和最后一次触摸的时间戳,并对其进行操作以进行日志记录和分析。跨度>
  • 你用的是什么版本的快递?
  • Express 版本 3.x 和护照最新版本。如果有帮助,我很乐意升级 express。

标签: javascript node.js session express passport.js


【解决方案1】:

你正在做的是设置一个cookie“过期”参数。浏览器将在 cookie 过期后清除它,而您不会知道它——它根本不会与未来的请求之一一起到达。

您可以用来准确知道 cookie 是否过期的技巧是将时间戳写入 cookie 并将其生命周期(“过期”值)设置为某个遥远的时间(例如,2037 年)。 通过这种方式,您可以手动检查是否仍要将给定的 cookie 视为有效或是否要更新它。

遗憾的是,您必须按照以下方式编写自己的代码

app.use(function(req, res, next) {
    //Checking previously set cookie (if there is one)
    var session = JSON.parse(req.cookies['session'] || '');
    if (session && new Date(session.expires) < new Date()) {
        console.log('User session has expired.')
    }

    //Resetting the cookie
    res.cookie('session', JSON.stringify({ session: <sessionIDKeyHere>, expires: Date.now() + 3600000 }), {
        expires: new Date(2037, 0, 1),
        httpOnly: true,
        secure: true //Do you have https? If no, set to false
    });

    next();
});

【讨论】:

  • 忘记添加:这不会立即跟踪会话到期,仅在下一个请求时。因此,如果我点击您的页面并且再也没有返回,您将不会以这种方式发现它。但是您仍然可以记录我并跟踪我是否返回过。
猜你喜欢
  • 2014-09-14
  • 2016-01-18
  • 1970-01-01
  • 2013-02-07
  • 2013-03-11
  • 2014-12-05
  • 1970-01-01
  • 2015-08-12
  • 2015-12-02
相关资源
最近更新 更多