学习笔记《Laravel 登录态丢失处理》

当用户丢失登录态,或者是访问某些需要登录的页面时,需要建立一个机制,可以让用户在登录以后(甚至注册、忘记密码等操作以后),返回用户需要访问的页面,而不是首页

分三步实现:

  1. 如果用户想访问的页面没有登录态,则跳转到 /login,并追加原地址为 continue 参数
  2. 在 /login 页面将 continue 参数的值写入 cookie
  3. 用户成功登录以后读取 cookie,获取 continue 的值,并跳转到该页面

步骤一

如果用户想访问的页面没有登录态,则跳转到 /login,并追加原地址为 continue 参数的值

比较简单,直接在 laravel 的 layout 页面中添加:

@if (Auth::guest())
<script>
    if (location.pathname != '/login')
    {
      window.location =  location.origin + '/login?continue=' + encodeURI(location.href);
    }
</script>
@endif

步骤二

在 /login 页面将 continue 参数的值写入 cookie

需要修改 Laravel 的 Auth 组件的 LoginController 方法,首先为 AuthenticatesUsers 这个 trait 起一个别名(trait 的复写机制需要用别名来实现):

use AuthenticatesUsers {
    showLoginForm as traitShowLoginForm;
}

然后复写 showLoginForm() 方法:

public function showLoginForm()
{
    $response = $this->traitShowLoginForm();

    $referer = request()->continue;

    if ($referer)
    {
        Cookie::queue('continue', $referer, 3000);
    }

    return $response;
}

步骤三

用户成功登录以后读取 cookie,获取 continue 的值,并跳转到该页面

按照官方文档的要求,需要在 LoginController 中复写 redirectTo() 方法

代码为:

protected function redirectTo()
{
    $continue = Cookie::get('continue');

    setcookie('continue', null, -1); // 删除 cookie

    return $continue;
}

推荐阅读更多精彩内容