【问题标题】:ExpressJS session expiring despite activity尽管有活动,ExpressJS 会话仍将到期
【发布时间】: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 的这条注释可能是罪魁祸首:

【问题讨论】:

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

标签: node.js session express session-cookies


【解决方案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
猜你喜欢
  • 2015-06-26
  • 2019-08-25
  • 2022-01-07
  • 2013-08-22
  • 2020-03-17
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
相关资源
最近更新 更多