首页 文章

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

提问于
浏览
0

当用户会话使用Laravel功能到期时,我想自动重定向到我的登录页面 . 当用户尝试访问另一个页面并且会话过期时,我会重定向 . 我设置了一个生命周期,有助于自动注销,因为用户不活动,我想要的是当会话超时时立即重定向 .

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

我也尝试过使用AJAX,每分钟发送检查会话状态的请求,这样可行,但是当项目正在 生产环境 中时,对服务器的许多请求只是为了检查会话状态 . (这是帮助我这个https://laracasts.com/discuss/channels/laravel/help-is-neededd-on-idle-session-time-out的链接)

现在,我正在尝试使用 App/Exceptions/Handler.php ,使用 unauthenticated() 函数:

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

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

Redirect User to Login Page When Session Expires - Laravel

最后一个解决方案不起作用,没有出现错误,但绝对没有做任何事情 .

如果有可能,请告诉我正确的方法 .

2 回答

  • 2

    由于您的会话具有固定的生命周期,您可以将该信息传递给客户端,并让客户负责查询服务,以确定您期望会话过期时的会话到期,以便不会不断地查询您的服务以获取其会话状态,他们只是在它可能已经过期时才查询 .

    • 用户向您的网站发出请求

    • 中间件生成一个时间戳,表示其会话将到期的时间点,并将其返回给客户端以存储为cookie

    • Javascript在客户端上运行,从cookie中检索其会话到期时间戳,然后在达到该时间戳时检查cookie值是否已更改,如果没有,则会向会话状态 endpoints 发出请求以确认其会话已不再有效

    • 您的会话状态 endpoints 返回过期状态(触发非活动会话行为)或返回新时间戳,然后您可以更新cookie,以便在达到该到期时再次重复该过程

    我个人不建议在会话过期时自动将某个人重定向到登录表单,因为这意味着当他们打开许多页面时,每个页面现在都是登录表单,这是一种糟糕的用户体验 . 许多技术用户会理解他们可以在一个页面上登录然后刷新其他页面,但是许多非技术人员不会这样做,他们会相信他们必须在每个页面上输入他们的用户名和密码 .

    如果您的应用程序甚至在页面加载后依赖于活动会话 - 即它是使用ajax的单页应用程序 - 那么当会话到期时,您应该禁用具有“您的会话已过期的模式”的页面,请再次登录继续使用这个页面“当他们点击登录时,你首先检查他们是否有一个活动的会话,如果不是,那么你是否重定向到登录表单 . 这意味着如果他们打开了许多选项卡并且会话过期,当他们返回到这些选项卡并单击“登录”按钮时,他们的页面将立即恢复使用 . 这是一种更好的用户体验 .

  • 0

    你可以使用 Auth::check()

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

相关问题