Laravel 的 CSRF(跨站请求伪造)保护机制是为了防止恶意网站通过用户的浏览器发起对应用程序的非法请求。当使用 jQuery 的 AJAX 发送请求时,如果没有正确设置 CSRF 令牌,就会出现“CSRF 令牌不匹配”的异常。
CSRF 令牌是一个随机生成的字符串,它与用户的会话相关联,并且每次请求都需要验证这个令牌以确保请求是由合法的用户发起的。
当使用 jQuery 的 AJAX 发送 PUT 请求时,如果没有在请求头中包含 CSRF 令牌,Laravel 将无法验证请求的合法性,从而抛出“CSRF 令牌不匹配”的异常。
在 HTML 的 <head>
部分添加以下 meta 标签:
<meta name="csrf-token" content="{{ csrf_token() }}">
然后在 jQuery 中设置全局 AJAX 请求头:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
在发送 AJAX 请求时,可以直接在请求头中添加 CSRF 令牌:
$.ajax({
url: '/your-endpoint',
type: 'PUT',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
data: {
// your data here
},
success: function(response) {
// handle success
},
error: function(xhr, status, error) {
// handle error
}
});
如果你在 Blade 模板中使用 AJAX,可以直接在模板中设置 CSRF 令牌:
<script>
let token = '{{ csrf_token() }}';
$.ajax({
url: '/your-endpoint',
type: 'PUT',
headers: {
'X-CSRF-TOKEN': token
},
data: {
// your data here
},
success: function(response) {
// handle success
},
error: function(xhr, status, error) {
// handle error
}
});
</script>
假设你有一个 PUT 请求需要发送到 /api/resource/1
,以下是完整的示例代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>CSRF Protection</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<button id="update-resource">Update Resource</button>
<script>
$(document).ready(function() {
$('#update-resource').click(function() {
$.ajax({
url: '/api/resource/1',
type: 'PUT',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
data: {
name: 'New Resource Name'
},
success: function(response) {
alert('Resource updated successfully!');
},
error: function(xhr, status, error) {
alert('An error occurred: ' + error);
}
});
});
});
</script>
</body>
</html>
通过以上方法,你可以确保在使用 jQuery 的 AJAX 发送 PUT 请求时,Laravel 的 CSRF 保护机制能够正常工作,避免出现“CSRF 令牌不匹配”的异常。