尽管有活动,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 会话仍将到期的主要内容,如果未能解决你的问题,请参考以下文章
如何在 mvc 5 中知道 OWIN cookie/用户会话即将到期