我遇到一个问题,当用户闲置超过24小时(我的会话超时),或离开网站然后在24小时后回来时,他们没有被退出网站,但他们的会话正在过期,或者至少他们的_token不再有效。
这会导致不必要的行为,就像用户在_token过期后提交表单一样,他们现在收到TokenMismatchException
。
在本地看来,当空闲时间超过会话生存期时,用户已注销,但是在实时服务器的生产中情况并非如此,空闲时间可能超过会话生存期但用户仍然登录如果用户已登录,则Auth::check()
和Auth::user()
都会按预期运行。
即使会话已过期,会导致用户未注销的原因是什么?
有没有办法可以检查会话是否已过期,以便我可以手动将用户注销,并要求他们重新登录?
我曾尝试使用App::before
过滤器检查会话的last_activity并确定它是否已过期,但一旦会话过期,我就无法访问它,因为它已从数据库中删除因此,我无法比较时间戳来确定用户是否需要手动注销并提示重新登录。
我的会话配置:
'driver' => 'database',
'lifetime' => 1440,
'expire_on_close' => false,
感谢。
答案 0 :(得分:0)
我也一直在努力寻找这个问题的解决方案很长一段时间。 95%的情况下,一切都很顺利,但有些AJAX请求会随着Illuminate\Session\TokenMismatchException
错误而随机死亡。
刚才我部署了一个快速而又脏的修复程序 - 我把这段代码放到了布局中:
setInterval(function () {
$.get(window.location.origin + '/keepSessionAlive')
.fail(function(response) {
Sentry.trackError(
'KeepSessionAlive request failed. ' +
'Response: ' + JSON.stringify(response)
);
});
}, 300000);
就像它看起来的转储一样,它只是每隔5分钟向服务器发送一个请求,以确保会话保持活动状态。
(/keepSessionAlive
端点位于web
中间件组下,只返回{ success: true }
)
希望它能有所作为:)