2014-12-26 2 views
4

У меня возникает проблема, когда пользователь простаивает более 24 часов (мой тайм-аут сеанса) или покидает сайт, а затем возвращается через 24 часа, они не выходят из системы сайт, но их сессия истекла, или, по крайней мере, их _token больше не действует.Laravel TokenMismatchException session timeout

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

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

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

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

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

Моя сессия конфигурации:

'driver' => 'database', 

'lifetime' => 1440, 

'expire_on_close' => false, 

Спасибо.

+0

У вас есть конфиг/производство/файл session.php, который может быть переопределение значения по умолчанию? – Laravelian

+0

Нет У меня есть только config/local/session.php для dev, а затем по умолчанию config/session.php для производства. Я должен добавить, что эти два зеркала друг друга, кроме того, для значения «время жизни», которое намного короче в dev для тестирования. – Vigs

+0

Это точно проблема лица. Вы нашли решение или обходное решение? – lunacafu

ответ

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 минут, чтобы убедиться, что сеанс сохранен в живых.

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

Надеется, что это будет делать разницу :)

+1

Вы можете перенаправить пользователя на страницу входа всякий раз, когда вызывается «TokenMismatchException». Они уже создали [вопрос] (https://github.com/laravel/framework/issues/8172) для этого на Github – Fahmi