(已解决)Laravel 不显示 419 csrf 页面。

问题

页面的登陆按钮是使用的提交表单形式,但是在几个小时后,csrf过期了之后,点击退出会,显示 419 页面,如何避免显示这个419页面呢,或者 csrf 过期的话,自动刷新本页面,重新获取 csrf 也可以呀。

<a href="{{ route('logout') }}" onclick="event.preventDefault();document.getElementById('logout-form').submit();">退出</a>
<form id="logout-form" action="{{ route('front.logout') }}" method="POST" style="display: none;">
     @csrf
</form>

Laravel 不显示 419 csrf 页面。

思路

经过11月10日下午的测试,发现我下面的内容是错误的,官方也会报 csrf 419。


(错误的)我使用了官方自带的认证,这个在 csrf 过期(也就是 session 失效后),点击退出后并没有像我一样显示 419 页面,我正在弄明白这个原理。(错误的)如果大家有懂这个原理的,请不吝赐教~😁😁😁

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

app/Exceptions/Handler.php 中,,修改 render 方法:

public function render($request, Exception $exception)
{
    if (!$request->ajax() && ($exception instanceof TokenMismatchException)) {
        return redirect()
            ->back()
            ->withErrors('表单已过期,请重新提交') // 可选
            ->withInput($request->input()); // 可选
    }

    return parent::render($request, $exception);
}
5年前 评论
zhaochong 5年前
largezhou (作者) 5年前
讨论数量: 20

app/Exceptions/Handler.php 中,,修改 render 方法:

public function render($request, Exception $exception)
{
    if (!$request->ajax() && ($exception instanceof TokenMismatchException)) {
        return redirect()
            ->back()
            ->withErrors('表单已过期,请重新提交') // 可选
            ->withInput($request->input()); // 可选
    }

    return parent::render($request, $exception);
}
5年前 评论
zhaochong 5年前
largezhou (作者) 5年前
自由与温暖是遥不可及的梦想

社区解决方案 有问题,先搜索一下。

5年前 评论
小李世界 5年前
miaotiao (楼主) 5年前

后端重定向回登录页面,然后带上数据吧,一般都这么做。

5年前 评论
自由与温暖是遥不可及的梦想 5年前
miaotiao (楼主) 5年前

退出功能不需要用到表单。直接在退出控制器里清除session就好了。

5年前 评论
miaotiao (楼主) 5年前
朕略显ぼうっと萌

你可以捕获这个异常 TokenMismatchException ,对于这个异常进行处理就好了!

5年前 评论
miaotiao (楼主) 5年前

这个问题是因为 session 过期导致,我之前提交过 PR,但是被官方拒绝了。

如果你要避免这样的问题,可以看下 PR 提交的内容,变更过滤器的顺序即可。点我查看详细

5年前 评论
miaotiao (楼主) 5年前
miaotiao (楼主) 5年前
24K大白羊 (作者) 5年前
miaotiao (楼主) 5年前

app/Exceptions/Handler.php 中,,修改 render 方法:

public function render($request, Exception $exception)
{
    if (!$request->ajax() && ($exception instanceof TokenMismatchException)) {
        return redirect()
            ->back()
            ->withErrors('表单已过期,请重新提交') // 可选
            ->withInput($request->input()); // 可选
    }

    return parent::render($request, $exception);
}
5年前 评论
zhaochong 5年前
largezhou (作者) 5年前

csrf看一下except的忽略列表。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!