当用户丢失登录态,或者是访问某些需要登录的页面时,需要建立一个机制,可以让用户在登录以后(甚至注册、忘记密码等操作以后),返回用户需要访问的页面,而不是首页
分三步实现:
- 如果用户想访问的页面没有登录态,则跳转到 /login,并追加原地址为 continue 参数
- 在 /login 页面将 continue 参数的值写入 cookie
- 用户成功登录以后读取 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;
}