Laravel TokenMismatchException 会话超时
Posted
技术标签:
【中文标题】Laravel TokenMismatchException 会话超时【英文标题】:Laravel TokenMismatchException session timeout 【发布时间】:2015-02-24 00:58:31 【问题描述】:我遇到了一个问题,当用户闲置超过 24 小时(我的会话超时),或离开站点然后在 24 小时后返回时,他们并没有被从站点注销,而是他们的会话即将过期,或者至少它们的 _token 不再有效。
这会导致不必要的行为,就好像用户在他们的 _token 过期后提交了一个表单,他们现在收到了一个TokenMismatchException
。
在本地看来,当空闲时间超过会话生命周期时,用户将被注销,但在实时服务器上的生产中,情况并非如此,空闲时间可以超过会话生命周期,但用户仍处于登录状态如果用户登录,Auth::check()
和 Auth::user()
都会按预期运行。
什么会导致用户即使会话已过期也无法退出?
有没有一种方法可以检查会话是否已过期,以便我可以手动注销用户并显示一条消息,要求他们重新登录?
我尝试使用App::before
过滤器来检查会话上的 last_activity 并确定它是否已过期,但是一旦会话过期,我就无法再访问它,因为它已从数据库中删除,因此我无法比较时间戳以确定用户是否需要手动注销并提示重新登录。
我的会话配置:
'driver' => 'database',
'lifetime' => 1440,
'expire_on_close' => false,
谢谢。
【问题讨论】:
您是否有可能覆盖默认值的 config/production/session.php 文件? 不,我只有一个用于开发的 config/local/session.php,然后是用于生产的默认 config/session.php。我应该补充一点,除了“生命周期”的价值之外,这两者相互镜像,这在开发测试中要短得多。 这正是面临的问题。您是否找到任何解决方案或解决方法? 我无法找到问题的原因或解决方案。我有一些用户向我表示他们没有遇到这个问题,这增加了额外的复杂性,它不会影响所有用户,只会影响一些用户,包括我自己。 【参考方案1】:我也一直在努力寻找解决这个问题的方法。 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
)
希望它会有所作为:)
【讨论】:
当TokenMismatchException
被捕获时,您可以将用户重定向到登录页面。他们已经在 Github 上为此创建了一个 issue以上是关于Laravel TokenMismatchException 会话超时的主要内容,如果未能解决你的问题,请参考以下文章