Laravel TokenMismatchException会话超时

时间:2014-12-26 20:44:27

标签: php session laravel csrf

我遇到一个问题,当用户闲置超过24小时(我的会话超时),或离开网站然后在24小时后回来时,他们没有被退出网站,但他们的会话正在过期,或者至少他们的_token不再有效。

这会导致不必要的行为,就像用户在_token过期后提交表单一样,他们现在收到TokenMismatchException

在本地看来,当空闲时间超过会话生存期时,用户已注销,但是在实时服务器的生产中情况并非如此,空闲时间可能超过会话生存期但用户仍然登录如果用户已登录,则Auth::check()Auth::user()都会按预期运行。

即使会话已过期,会导致用户未注销的原因是什么?

有没有办法可以检查会话是否已过期,以便我可以手动将用户注销,并要求他们重新登录?

我曾尝试使用App::before过滤器检查会话的last_activity并确定它是否已过期,但一旦会话过期,我就无法访问它,因为它已从数据库中删除因此,我无法比较时间戳来确定用户是否需要手动注销并提示重新登录。

我的会话配置:

'driver' => 'database',

'lifetime' => 1440,

'expire_on_close' => false,

感谢。

1 个答案:

答案 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 }

希望它能有所作为:)