首页
学习
活动
专区
圈层
工具
发布

Laravel,尝试通过AJAX向控制器传递数据时出现不匹配的令牌错误

Laravel AJAX请求中的令牌不匹配错误解决方案

基础概念

在Laravel中,CSRF(跨站请求伪造)保护是默认启用的安全机制。当使用AJAX向Laravel控制器发送POST、PUT、PATCH或DELETE请求时,必须包含有效的CSRF令牌,否则会返回"419 HTTP状态码"或"CSRF token mismatch"错误。

错误原因

出现令牌不匹配错误通常有以下几种原因:

  1. 请求中没有包含CSRF令牌
  2. 令牌已过期(默认会话有效期为2小时)
  3. 令牌不正确或格式错误
  4. 请求头没有正确设置

解决方案

方法1:在表单中包含CSRF令牌

代码语言:txt
复制
$.ajax({
    url: '/your-endpoint',
    type: 'POST',
    data: {
        _token: '{{ csrf_token() }}',
        // 其他数据...
    },
    success: function(response) {
        console.log(response);
    }
});

方法2:在meta标签中设置CSRF令牌

在HTML头部添加:

代码语言:txt
复制
<meta name="csrf-token" content="{{ csrf_token() }}">

然后在AJAX请求中设置请求头:

代码语言:txt
复制
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

$.ajax({
    url: '/your-endpoint',
    type: 'POST',
    data: {
        // 你的数据...
    },
    success: function(response) {
        console.log(response);
    }
});

方法3:对于API路由(免除CSRF保护)

如果你正在开发API,可以在app/Http/Middleware/VerifyCsrfToken.php中排除特定路由:

代码语言:txt
复制
protected $except = [
    'your-api-endpoint/*',
    'another-endpoint'
];

最佳实践

  1. 对于普通表单提交:使用Laravel的@csrf指令
  2. 对于AJAX请求:推荐使用方法2(meta标签+请求头)
  3. 对于纯API:考虑使用API认证方式(如JWT)并禁用CSRF保护

示例代码

完整的前后端交互示例:

代码语言:txt
复制
<!-- 视图文件 -->
<head>
    <meta name="csrf-token" content="{{ csrf_token() }}">
</head>
<script>
$(document).ready(function() {
    $('#submit-btn').click(function() {
        $.ajax({
            url: '/process-data',
            type: 'POST',
            data: {
                name: $('#name').val(),
                email: $('#email').val()
            },
            success: function(response) {
                alert('成功: ' + response.message);
            },
            error: function(xhr) {
                alert('错误: ' + xhr.responseJSON.message);
            }
        });
    });
});
</script>
代码语言:txt
复制
// 控制器
public function processData(Request $request)
{
    $validated = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|email'
    ]);
    
    // 处理数据...
    
    return response()->json(['message' => '数据处理成功']);
}

注意事项

  1. 确保在开发环境中启用了会话支持
  2. 检查浏览器是否禁用了cookie(会影响会话)
  3. 如果使用多个AJAX请求,建议全局设置CSRF令牌头
  4. 在生产环境中,确保CSRF保护处于启用状态以保障安全
相关搜索:通过ajax将数组传递给控制器时出现错误404localhost上laravel 5.3的ajax post请求中出现CSRF令牌不匹配异常在laravel中使用ajax传递控制器刀片文件中的搜索数据时出现问题通过Ajax将数据发送到Laravel中的控制器时,数据为空通过ajax从模式中的<select>传递值时出现内部服务器错误将数据传递给Laravel通知构造函数时出现奇怪的错误尝试将浏览器和页面标题传递给function - UFT时出现类型不匹配浏览器错误通过json格式的ajax将日期传递给web服务时出现状态400错误500尝试在laravel 8中使用ajax删除mysql数据记录时出现内部服务器错误当通过AJAX向Controller Laravel 7发出POST请求时,出现“数组到字符串的转换”尝试从一个视图控制器向另一个视图控制器传输数据时出现断点错误尝试访问上传到亚马逊网络服务s3存储桶的图像时,出现签名不匹配错误尝试使用mysql工作台连接到laravel forge数据库时出现SSH错误(可以通过控制台正常连接)在VBscript中,当我尝试将数组列表中的每个项目拆分为单个数组时,会出现类型不匹配错误从ajax调用向MVC控制器传递数据时,我得到一个空对象或一个具有空值的对象将数据类型(O)和'float64‘数组合并到数据帧时,项数错误且传递的值的形状不匹配木偶人,nodejs。我不确定为什么尝试通过变量传递值时会出现错误"is undefined",但当我使用普通的int时,它可以工作尝试从传递给自定义节点中辅助函数的MDataHandle获取数据时出现空指针错误(Maya 2016 SP6,Python API)
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券