从已清除的会话中单击注销后,Laravel 5.8 显示“419 页面已过期”

我运行php artisan make:auth命令,然后我将逐步解释我接下来要做什么以了解场景,

  • 登录到新会话 (example.com/home)

  • 打开一个新标签并粘贴 url,即 example.com/home。

  • 现在 2 个选项卡在同一个会话中打开。

  • 我从其中一个选项卡中单击了注销,它运行良好

  • 然后,当我尝试从另一个选项卡注销时,它给了我一个错误,提示“419 页面已过期”,即使重新加载后它也无处可去。

问题是,这种情况可能会出现,我不想看到这个错误信息,点击注销后直接注销,即使会话已过期。

注意:这个问题不是因为没有添加@csrf


MMMHUHU
浏览 196回答 3
3回答

HUWWW

嗯,这是一个明显的信息,您可以尝试为该页面制作更好的布局,但仍然最好显示它以便用户知道发生了什么。如果您想以不同的方式处理它,您可以尝试重定向到登录页面。因此,在您的app\Exceptions\Handler.php文件中的渲染方法中添加以下内容:if ($exception instanceof \Illuminate\Session\TokenMismatchException) {    return redirect()->route('login');}

白板的微信

问题的解决方法比较简单,只需要在VerifyCsrfToken中间件上加一点点;use Closure;    public function handle($request, Closure $next)    {        if(!Auth::check() && $request->route()->named('logout')) {                    $this->except[] = route('logout');                    }                return parent::handle($request, $next);    }通常这个文件只包含一个 $except 路由数组,应该被 csrf 忽略。在这段代码中,我们覆盖了 handle 方法并执行了两项检查。用户是访客(即,不使用经过身份验证的会话),并且,是登出路线的路线如果两者都为真,那么我们将 'logout' 添加到 except 数组。然后我们将控制权传递给核心 VerifyCsrfMiddleware,它识别阵列中是否存在注销路由,并绕过检查。表单数据正确发布,我们使用 LogoutResponse 重定向。用户看不到错误页面。通过这种方式检查,我们确保真正的注销请求仍然受到 CSRF Token 的保护。
打开App,查看更多内容
随时随地看视频慕课网APP