Laravel TokenMismatchException время ожидания сеанса

Я сталкиваюсь с проблемой, когда пользователь бездействует более 24 часов (время ожидания моего сеанса) или покидает сайт, а затем возвращается через 24 часа, он не выходит из системы, но его сеанс истек или, по крайней мере, их _token больше не действителен.

Это вызывает нежелательное поведение, как будто пользователь отправляет форму после истечения срока действия _token, и теперь он получает TokenMismatchException,

Локально кажется, что, когда время простоя превышает время жизни сеанса, пользователь вышел из системы, однако в производственной среде на живом сервере это не так, время простоя может превысить время жизни сеанса, и все же пользователь все еще вошел в систему и Auth::check() а также Auth::user() Обе функции, как и ожидалось, если пользователь вошел в систему.

Что может привести к тому, что пользователь не выйдет из системы, даже если срок его сеанса истек?

Есть ли способ, которым я могу проверить, что сеанс истек, чтобы я мог вручную выйти из системы с сообщением с просьбой войти в систему?

Я пытался использовать App::before фильтр, чтобы проверить last_activity в сеансе и определить, истек ли он, но после истечения сеанса у меня больше нет доступа к нему, так как он был удален из базы данных, поэтому я не могу сравнить временные метки, чтобы определить, нужно ли пользователю выйти из системы вручную и запросить повторный вход.

Мой сессионный конфиг:

'driver' => 'database',

'lifetime' => 1440,

'expire_on_close' => false,

Благодарю.

4

Решение

Я также долго пытался найти решение этой проблемы. Все идет хорошо в 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 минут, чтобы убедиться, что сеанс поддерживается.

(The /keepSessionAlive конечная точка находится под web группа промежуточного программного обеспечения и просто возвращается { success: true })

Надеюсь, это будет иметь значение 🙂

0

Другие решения

Других решений пока нет …