当用户会话在 Laravel 5.5 后过期时自动重定向

Redirect automatically when user session expires in Laravel 5.5

我想使用 Laravel 函数在用户会话过期时自动重定向到我的登录页面。 当用户尝试访问另一个页面并且会话过期时,我会进行重定向。 我已经设置了一个生命周期,它有助于在用户不活动时自动注销,我想要的是在会话超时时立即重定向。

我尝试使用 JavaScript 来超时,但是当用户同时使用多个页面时这不起作用。

我也尝试过使用 AJAX,每分钟发送一次检查会话状态的请求,这是有效的,但是当项目在生产中时,有很多请求到服务器只是为了检查会话状态。 (这是 link 对我有帮助 https://laracasts.com/discuss/channels/laravel/help-is-neededd-on-idle-session-time-out

现在,我正在尝试将 App/Exceptions/Handler.phpunauthenticated() 一起使用功能:

protected function unauthenticated($request, AuthenticationException $exception)
{
  if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return redirect()->guest(route('login'));
}

()

最后一个解决方案不起作用,没有出现错误,但什么也没做。

如果可以,请告诉我正确的方法。

由于您的会话具有固定的生命周期,因此您可以将该信息传递给客户端,并让客户端负责查询服务以确定会话在您预期会话到期时的到期时间,而不是不断查询您的服务对于他们的会话状态,他们只在可能过期时查询。

  1. 用户向您的网站发出请求
  2. 中间件生成一个时间戳,表示其会话到期的时间点,并将其return发送给客户端以存储为 cookie
  3. Javascript 在客户端上运行,从 cookie 中检索会话过期的时间戳,然后当达到该时间戳时,您检查 cookie 值是否已更改,如果没有,则发出请求您的会话状态端点以确认他们的会话不再处于活动状态
  4. 您的会话状态端点return是过期状态(触发非活动会话行为)它return是一个新的时间戳,您可以然后更新 cookie,以便在达到到期时再次重复该过程

我个人 建议在会话过期时自动将某人重定向到登录表单,因为这意味着当他们打开许多页面时,每个页面现在都是登录表单这是一个糟糕的用户体验。许多技术用户会明白他们可以在一个页面上登录然后刷新其他页面,但是很多 non-technical 人不会,他们会认为他们必须在每个页面上输入用户名和密码。

如果您的应用程序甚至在页面加载后仍依赖于活动会话——即它是使用 ajax 的单页应用程序——那么当会话过期时,您应该使用显示 "Your session has expired, please log in again to continue using this page" 并且当他们单击登录时,您首先检查他们是否有活动会话,如果没有,您将重定向到登录表单。这意味着如果他们打开了许多选项卡并且他们的会话过期,当他们 return 到这些选项卡并单击 "log in" 按钮时,他们的页面使用会立即恢复。这是一个更好的用户体验。

您可以使用Auth::check()

if(Auth::check()) { 
    //Do anything you want
}
return redirect('/login');