【问题标题】:Find out how much time until the current session expires in Laravel 5.7?在 Laravel 5.7 中找出当前会话到期还有多长时间?
【发布时间】:2019-08-10 07:38:51
【问题描述】:

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”何时更新,但它不会在页面刷新时发生。

【问题讨论】:

  • 您可以使用Session::activity() 获取上次会话活动完成的时间。
  • @BharatGeleda Session::activity() 似乎在 5.7 中被删除
  • @BharatGeleda 我查看了“在 Laravel 中检查会话超时”问题,但我想找出剩余的到期时间,而不是它是否过期。所以我认为这是一个不同的问题。
  • 好吧,如果你能得到最后一个活动,你可以像这样计算等待时间Session::activity() + (Config::get('session.lifetime') * 60) - time()
  • 如果你使用 DB,你可以使用类似 DB::table('sessions')->select('last_activity')->where('id', $request->session()->get('id'))->first(); 的东西来获取最后一个活动

标签: laravel session laravel-5.7


【解决方案1】:

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

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

因此,从当前时间和 session_end_time 的差异中,您可以获得剩余时间。

您可以使用碳作为时间戳和差异

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      所以我知道这是一个旧的,但我想我会分享我想出的解决方案。我已经实现了一个中间件,它将会话变量“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 后,此计时器都会自动重置。

      【讨论】:

        猜你喜欢
        • 2011-01-18
        • 2012-11-14
        • 2016-03-07
        • 2019-11-07
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 1970-01-01
        • 2018-04-19
        相关资源
        最近更新 更多