Laravel程序提示:CSRF Token Mismatch.错误是因为默认启用 CSRF 保护,解决办法有两种:

方法一:从 CSRF 保护中排除 URI

有时你可能希望从 CSRF 保护中排除一组 URI。比如接入支付宝或者微信支付后接受回调信息的 URI ,因为支付宝或微信不会要向您的路由发送 CSRF 令牌。

通常,你应该将这些类型的路由放在 AppProvidersRouteServiceProvider 应用于 routes/web.php 文件中的所有路由的 web 中间件组之外。但是,你现在也可以通过将路由的 URI 添加到 VerifyCsrfToken 中间件的 $except 属性来排除路由:

<?php

namespace AppHttpMiddleware;

use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * 从 CSRF 验证中排除的 URI。
     *
     * @var array
     */
    protected $except = [
        'alipay/notify',
        'https://www.codesou.cn/wechat/notify',
    ];
}

方法二、在表单或者ajax请求中添加 CSRF 令牌

表单代码示例:

<form method="POST" action="https://www.codesou.cn/profile">
    @csrf
    <!-- 或者(标红的代码功能相同,选择任意一种即可) -->
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>

ajax 请求示例:

首先将令牌存储在 HTML 的 meta 标签中:

<meta name="csrf-token" content="{{ csrf_token() }}">

然后,就可以指示 jQuery 之类的库自动将令牌添加到所有请求标头。这为使用传统 JavaScript 技术的基于 AJAX 的应用程序提供了简单、方便的 CSRF 保护:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

总结

通常情况下,建议使用方法二来解决 CSRF Token Mismatch. 问题,这样一般会更安全。只有在特定的需求下并且我们会对请求参数进行严格的校验时才使用方法一。