Laravel中AJAX删除数据出现CSRF Token Mismatch错误求助
解决Laravel AJAX DELETE请求的CSRF Token Mismatch错误
首先,咱们先揪出你代码里的核心问题:AJAX设置的请求头键名写错了。Laravel要求的CSRF验证头是X-CSRF-TOKEN(横杠分隔),但你写成了X_CSRF_TOKEN(下划线分隔),这就是导致令牌不匹配的主要原因。
下面给你一步步修正和优化的方案:
方案一:修正请求头键名
把$.ajaxSetup里的headers键改成正确格式,这是最直接的修复方式:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
修改后,你的AJAX请求就能正确携带Laravel需要的CSRF令牌了。
方案二:直接在请求数据中传入令牌
如果你不想设置全局的ajaxSetup,也可以把CSRF令牌直接放到请求的data参数里:
$('.deletePhoto').click(function () { var id = $(this).data('id'); var el = this; $.ajax({ url: '/photo/delete/'+id, type: 'DELETE', dataType: 'JSON', data: { '_token': $('meta[name="csrf-token"]').attr('content'), 'id': id }, success: function () { $(el).closest(".photo-details").remove(); console.log('DELETED'); }, error: function (xhr) { console.log(xhr.responseText); } }) });
这种方式同样能让Laravel正确验证CSRF令牌。
额外优化建议
- 你页面头部的
<meta name="csrf-token" content="{{ csrf_token() }}">是正确的,不用改动。 - Blade按钮里的
data-token其实可以去掉,因为已经通过meta标签获取令牌了,留着也不影响,但没必要冗余。 - 控制器的
destroy方法可以加个容错处理,避免找不到对应ID的照片时报错:
public function destroy($id) { $photo = Photo::findOrFail($id); $photo->delete(); return response()->json(['success' => true]); }
用findOrFail会自动返回404响应,同时返回JSON数据让前端更易处理请求结果。
这样调整后,你的AJAX删除请求应该就能正常工作,不会再出现CSRF Token Mismatch的错误了。
内容的提问来源于stack exchange,提问作者Chonchol Mahmud
相关产品推荐
相关产品推荐

