Я сталкиваюсь с проблемой, когда пользователь бездействует более 24 часов (время ожидания моего сеанса) или покидает сайт, а затем возвращается через 24 часа, он не выходит из системы, но его сеанс истек или, по крайней мере, их _token больше не действителен.
Это вызывает нежелательное поведение, как будто пользователь отправляет форму после истечения срока действия _token, и теперь он получает TokenMismatchException
,
Локально кажется, что, когда время простоя превышает время жизни сеанса, пользователь вышел из системы, однако в производственной среде на живом сервере это не так, время простоя может превысить время жизни сеанса, и все же пользователь все еще вошел в систему и Auth::check()
а также Auth::user()
Обе функции, как и ожидалось, если пользователь вошел в систему.
Что может привести к тому, что пользователь не выйдет из системы, даже если срок его сеанса истек?
Есть ли способ, которым я могу проверить, что сеанс истек, чтобы я мог вручную выйти из системы с сообщением с просьбой войти в систему?
Я пытался использовать App::before
фильтр, чтобы проверить last_activity в сеансе и определить, истек ли он, но после истечения сеанса у меня больше нет доступа к нему, так как он был удален из базы данных, поэтому я не могу сравнить временные метки, чтобы определить, нужно ли пользователю выйти из системы вручную и запросить повторный вход.
Мой сессионный конфиг:
'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);
Как выглядит дамп, он просто отправляет запрос на сервер каждые 5 минут, чтобы убедиться, что сеанс поддерживается.
(The /keepSessionAlive
конечная точка находится под web
группа промежуточного программного обеспечения и просто возвращается { success: true }
)
Надеюсь, это будет иметь значение 🙂
Других решений пока нет …