在Laravel中,CSRF(跨站请求伪造)保护是默认启用的安全机制。当使用AJAX向Laravel控制器发送POST、PUT、PATCH或DELETE请求时,必须包含有效的CSRF令牌,否则会返回"419 HTTP状态码"或"CSRF token mismatch"错误。
出现令牌不匹配错误通常有以下几种原因:
$.ajax({
url: '/your-endpoint',
type: 'POST',
data: {
_token: '{{ csrf_token() }}',
// 其他数据...
},
success: function(response) {
console.log(response);
}
});
在HTML头部添加:
<meta name="csrf-token" content="{{ csrf_token() }}">
然后在AJAX请求中设置请求头:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
url: '/your-endpoint',
type: 'POST',
data: {
// 你的数据...
},
success: function(response) {
console.log(response);
}
});
如果你正在开发API,可以在app/Http/Middleware/VerifyCsrfToken.php
中排除特定路由:
protected $except = [
'your-api-endpoint/*',
'another-endpoint'
];
@csrf
指令完整的前后端交互示例:
<!-- 视图文件 -->
<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>
// 控制器
public function processData(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email'
]);
// 处理数据...
return response()->json(['message' => '数据处理成功']);
}
没有搜到相关的文章