(已解决)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 页面,我正在弄明白这个原理。(错误的)如果大家有懂这个原理的,请不吝赐教~😁😁😁

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

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);
}
4年前 评论
zhaochong 4年前
largezhou (作者) 4年前
讨论数量: 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);
}
4年前 评论
zhaochong 4年前
largezhou (作者) 4年前

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);
}
4年前 评论
zhaochong 4年前
largezhou (作者) 4年前
朕略显ぼうっと萌

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

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

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

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

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

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

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

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

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

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

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

csrf看一下except的忽略列表。

4年前 评论

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