尽管有活动,ExpressJS 会话仍将到期

Posted

技术标签:

【中文标题】尽管有活动,ExpressJS 会话仍将到期【英文标题】:ExpressJS session expiring despite activity 【发布时间】:2013-01-06 01:21:00 【问题描述】:

自express group didn't have an answer 以来将这个问题提交给SO。

我正在设置会话 maxAge = 900000,并且我看到会话 cookie 上的 expires 属性设置正确。 但是,在后续请求中,超时不会被延长。它永远不会被扩展,cookie 最终会过期。

session middleware docs 说 Session#touch() 不是必需的,因为会话中间件会为我做这件事。我实际上尝试手动调用req.session.touch(),但什么也没做,我也尝试在req.session.cookie 上设置maxAge,但什么也没做:-(

我是否在某处遗漏了自动延长活动会话的设置?除了在每个请求上手动重新创建 cookie 之外,还有其他方法可以在最终用户活动后延长会话超时吗?


编辑:我在 express v3 中遇到了这个问题。我不是 100% 确定,但我认为来自 express changelog 的这条注释可能是罪魁祸首:

changed session() to only set-cookie on modification (hashed session json)

【问题讨论】:

去年我在我的一个项目中使用了 express 2.x。它在处理 session-cookie 方面同样出色,而且在这种情况下还有很多事情需要关注。您必须确认您的 cookie 属性,如路径、协议(仅限 http)和安全。通常,任何 HTTP 事务都将期望由先前请求设置的 cookie 用于进一步的身份验证过程。因此,请使用 firebug 或 Chrome 调试器在客户端(浏览器)中进行一些调试。并发布您的代码 sn-p 以提供更相关的答案 @jckdnk111 - 那个更新日志链接似乎已经消失了 - 你还有另一个吗? 【参考方案1】:

快速会话中现在存在滚动会话。在选项中设置rolling属性为true,它会通过设置maxAge偏移量重新计算过期值,应用于当前时间。

https://github.com/expressjs/session/issues/3

https://github.com/expressjs/session/issues/33

https://github.com/expressjs/session(搜索滚动)

例如,注意rolling

app.use(session(
  secret: 'a secret',
  cookie: 
    path: '/',
    httpOnly: true,
    secure: false,
    maxAge: 10 * 60 * 1000
  ,
  rolling: true
));

【讨论】:

根据 express-session 模块提供的最新配置选项,这应该是公认的答案。 点赞!你的设置中重新保存的值是多少?真假会影响滚动吗?【参考方案2】:

如果其他人有同样的问题,以下是解决方案:

function (req, res, next) 

    if ('HEAD' == req.method || 'OPTIONS' == req.method) return next();

    // break session hash / force express to spit out a new cookie once per second at most
    req.session._garbage = Date();
    req.session.touch();

    next();


【讨论】:

这不应该被报告为错误吗? 我在论坛上询问过,似乎没有人这么认为。我想它可以被认为是一项功能,因为您实际上可以控制何时延长或不延长会话。 对我来说似乎是奇怪的默认行为! 确实,至少是反直觉的。花了一个小时试图弄清楚为什么尽管手动 session.touch() 调用它不能开箱即用。非常感谢。 有一个关于此行为的错误报告:github.com/senchalabs/connect/issues/670

以上是关于尽管有活动,ExpressJS 会话仍将到期的主要内容,如果未能解决你的问题,请参考以下文章

PHP 会话在 40 分钟后到期

范围 codeigniter 会话到期

如何在 mvc 5 中知道 OWIN cookie/用户会话即将到期

尽管在 environment.d.ts 中,打字稿仍将 process.env 变量识别为未定义

由于不活动而导致会话超时[重复]

如何由于 Django 中的不活动而使会话过期?