TokenMismatchException

TokenMismatchException

我遇到了这样一个问题:当用户空闲超过24小时(我的会话超时),或者离开站点,然后在24小时后返回时,他们不会从站点注销,但他们的会话正在过期,或者至少他们的令牌不再有效。
这会导致不需要的行为,就像用户在其令牌过期后提交表单,现在他们收到TokenMismatchException
在本地,当空闲时间超过会话生存期时,用户似乎会注销,但在实时服务器上的生产环境中,情况并非如此,空闲时间可能会超过会话生存期,但用户仍会登录,并且如果用户是登录。
什么会导致用户即使会话已过期也无法注销?
有没有一种方法可以检查会话是否已过期,以便我可以手动注销用户,并显示一条消息,要求他们重新登录?
我试图使用Auth::check()筛选器检查会话上的最后一个活动,并确定它是否已过期,但一旦会话过期,我就无法再访问它,因为它已从数据库中删除,因此,我无法比较时间戳来确定用户是否需要手动注销并提示重新登录。
我的会话配置:

'driver' => 'database',

'lifetime' => 1440,

'expire_on_close' => false,

谢谢。

最佳答案

我也一直在努力寻找解决这个问题的方法。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);

正如dump看起来的那样,它只是每隔5分钟向服务器发送一个请求,以确保会话保持活动状态。
(端点在/keepSessionAlive中间件组下,只返回web
希望能有所不同:)

10-06 04:56