#laravel #session #laravel-5.7
#laravel #сеанс #laravel-5.7
Вопрос:
Есть ли способ в Laravel 5.7 узнать, сколько времени у пользователя осталось до истечения текущего сеанса?
ОТРЕДАКТИРОВАНО
Я также хочу проверить, когда истекает текущий сеанс для гостей, а также для зарегистрированных пользователей.
Кроме того, в текущих ответах, похоже, есть противоречивые идеи о том, что сеанс истекает ровно через «SESSION_LIFETIME» через несколько минут после входа в систему, в то время как другие думают, что сеанс истекает после последней активности пользователя. Было бы неплохо уточнить, какой из них правильный. Тогда также как затем получить время последнего действия и что классифицируется как действие в сеансе.
Кроме того, я думаю, что Session::activity() был удален в Laravel 5.7.
ВОЗМОЖНОЕ РЕШЕНИЕ
Благодаря @bharat-geleda, приведенному ниже, это рабочее решение, если вы используете Laravel 5.7 и храните сеансы в базе данных.
$last_activity = DB::table('sessions')->select('last_activity')->where('id', session()->getId())->first()->last_activity;
$session_time_remaining_minutes = ($last_activity (Config::get('session.lifetime') * 60) - time()) / 60;
dd($session_time_remaining_minutes);
В настоящее время мне неясно, когда обновляется ‘last_activity’, хотя это не происходит при обновлении страницы.
Комментарии:
1. Вы можете использовать
Session::activity()
, чтобы узнать время, когда было выполнено последнее действие сеанса.2. @BharatGeleda Session::activity(), похоже, удален в 5.7
3. @BharatGeleda Я просмотрел вопрос «Проверить время ожидания сеанса в Laravel», но я хочу узнать время, оставшееся до истечения срока действия, а не то, истекло оно или нет. Итак, я думаю, что это другой вопрос.
4. Ну, если вы можете получить последнее действие, вы можете рассчитать время ожидания примерно так
Session::activity() (Config::get('session.lifetime') * 60) - time()
5. Если вы используете DB, вы можете использовать что-то вроде этого
DB::table('sessions')->select('last_activity')->where('id', $request->session()->get('id'))->first();
, чтобы получить последнее действие
Ответ №1:
Добавьте два столбца в вашу таблицу аутентификации (пользователи), например session_start_time и session_end_time
теперь при входе пользователя обновите текущую временную метку в session_start_time и добавьте минуты в соответствии с вашим config/sessions.php (SESSION_LIFETIME);
таким образом, из разницы текущего времени и session_end_time вы можете получить оставшееся время.
вы можете использовать carbon для метки времени и для разницы
Ответ №2:
Итак, я знаю, что это старый вариант, но я подумал, что поделюсь решением, которое я придумал. Я внедрил промежуточное программное обеспечение, которое обновляет переменную сеанса «session_expiry», чтобы она соответствовала текущему времени плюс сеанс.время жизни на исходящей фазе каждого запроса (после обработки запроса). Поэтому во время обработки запроса вы можете проверить эту переменную сеанса, чтобы узнать, сколько времени осталось. Ниже приведен фрагмент из метода промежуточного программного обеспечения handle() (вы увидите, что я применяю это только к сеансам аутентификации):
// Return trip middleware
$response = $next($request);
// Update session expiry after request has been processed
if (auth()->check())
{
$expiry = (new CarbonCarbon())->addMinutes(config('session.lifetime'));
session()->put('session_expiry', $expiry);
}
elseif (session()->has('session_expiry'))
{
session()->forget('session_expiry');
}
return $response;
При этом обновляются все запросы, включая запросы AJAX и API. Затем я представил маршрут для вызова ajax, чтобы проверить, действителен ли сеанс по-прежнему. Благодаря таймеру, который установлен на 1 минуту дольше срока службы, это позволяет приложению корректно выйти из системы, если сеанс истек, но оставаться активным, если другие вкладки сохранили его работоспособность. Этот таймер автоматически сбрасывается после каждого вызова AJAX с помощью метода $(document).ajaxComplete.
Ответ №3:
Если бы вы знали, когда пользователь вошел в систему, сохранив его в таблице пользователей базы данных, и вы бы знали из config/sessions.php сколько времени осталось до истечения срока действия вашего сеанса, объединение двух позволит вам вычислить, сколько времени осталось до истечения срока действия сеанса пользователя.