已在请求头与表单数据中携带CSRF Token,Ajax请求仍返回419状态码问题求助
解决Laravel Ajax请求419状态码(CSRF验证失败)的问题
嘿,我之前也碰到过这种明明带了CSRF Token却返回419的坑,咱们一步步来排查和解决:
1. 先确认Token是否正确获取
首先得确保你拿到的Token是有效的,打开浏览器控制台执行以下命令,检查输出:
- 检查meta标签的Token:
console.log($('meta[name="csrf-token"]').attr('content')) - 检查表单input的Token:
console.log($("input[name='_token']").val())
这两个值应该完全一致,如果其中一个是undefined,说明选择器写错了或者标签没正确渲染(比如漏加了meta标签,或者input的name不是_token)。
2. 不要同时在Header和FormData中携带Token
Laravel只需要你通过一种方式传递CSRF Token就行,同时传两种不仅没必要,反而可能因为隐性冲突导致验证失败。建议二选一:
方式一:通过请求头传递(推荐)
去掉FormData中的_token字段,启用headers配置:
var headers = { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }; var formData = new FormData(); formData.append('request_id', $('#request_id').val()); var request = $.ajax({ url: appUrl + "/admin/schedule-detailing-requests", type: "POST", data: formData, processData: false, contentType: false, cache: false, dataType: "json", headers: headers });
方式二:通过FormData传递
去掉headers配置,只保留FormData中的_token:
var formData = new FormData(); formData.append('_token', $("input[name='_token']").val()); formData.append('request_id', $('#request_id').val()); var request = $.ajax({ url: appUrl + "/admin/schedule-detailing-requests", type: "POST", data: formData, processData: false, contentType: false, cache: false, dataType: "json" });
3. 检查路由是否在正确的中间件组
确保你的路由定义在routes/web.php里(默认应用web中间件组,包含CSRF验证);如果是在routes/api.php中,默认的api中间件组是不验证CSRF的,这时候若返回419,说明路由配置可能有误,或者你手动给api路由加了CSRF验证中间件。
4. 检查会话状态
如果页面打开时间太长,会话可能已经过期,导致Token失效。这时候刷新页面,重新获取新的Token后再发起请求试试。
5. 验证FormData是否正确传递
在发起请求前,通过控制台打印FormData的内容,确认_token和request_id都正确添加了:
console.log(formData.get('_token')); console.log(formData.get('request_id'));
如果以上步骤都试过还是不行,可以打开浏览器的Network面板,查看请求头和FormData的实际发送内容,确认Token确实被传到了服务器,这样能更精准定位问题。
内容的提问来源于stack exchange,提问作者Basharmal
相关产品推荐
相关产品推荐

