在Laravel 5.7中找出当前会话到期之前需要多少时间?

时间:2019-03-19 17:22:56

标签: laravel session 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'何时更新,刷新页面时不会发生。

4 个答案:

答案 0 :(得分:0)

如果您知道用户何时登录,并将其存储在数据库用户表中,并且从config / sessions.php中知道会话到期之前有多长时间,则将两者合在一起可以计算出会话的持续时间在用户会话过期之前。

答案 1 :(得分:0)

您可以通过更改config / session.php上的生命周期值来更改整个应用程序的会话生命周期:

/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/

'lifetime' => env('SESSION_LIFETIME', 120), // The default is 120
'expire_on_close' => false,

每次session_start()都会更新一个会话;叫做。例如,当刷新页面时,就会发生这种情况。因此您可以编写将计数器设置为(120 * 60)的jQuery代码,并在每次刷新时重新更新。

答案 2 :(得分:0)

在身份验证表中添加两列(用户) 例如session_start_time和session_end_time

现在,当用户登录更新session_start_time中的当前时间戳并根据您的config / sessions.php(SESSION_LIFETIME)添加分钟时;

因此,根据当前时间和session_end_time的差值,您可以获得剩余时间。

您可以将碳用于时间戳记和差异

答案 3 :(得分:0)

所以我知道这是一个旧的,但我想我会分享我想出的解决方案。我已经实现了一个中间件,它在每个请求的出站阶段(在处理请求之后)将会话变量“session_expiry”更新为当前时间加上 session.lifetime。因此,在整个请求处理过程中,您可以检查此会话变量以检查还剩多少时间。下面是中间件 handle() 方法的一个片段(你会看到我只将它应用于经过身份验证的会话):

// Return trip middleware
    $response = $next($request);

    // Update session expiry after request has been processed
    if (auth()->check())
    {
        $expiry = (new \Carbon\Carbon())->addMinutes(config('session.lifetime'));
        session()->put('session_expiry', $expiry);
    }
    elseif (session()->has('session_expiry'))
    {
        session()->forget('session_expiry');
    }

    return $response;

这会更新所有请求,包括 AJAX 和 API 请求。然后,我提出了一个 ajax 调用的路由,以检查会话是否仍然有效。使用比生命周期长 1 分钟的计时器,它使应用程序能够在会话过期时正常注销,但如果其他选项卡使其保持活动状态,则保持活动状态。每次使用 $(document).ajaxComplete 方法调用 AJAX 后,此计时器都会自动重置。