在Laravel中,CSRF(跨站请求伪造)保护是默认启用的安全机制。当使用AJAX请求时,需要确保每个请求都包含有效的CSRF令牌,否则会返回"419 令牌不匹配"错误。
AJAX请求中出现令牌不匹配通常有以下原因:
<form id="myForm">
@csrf
<!-- 其他表单字段 -->
<button type="submit">提交</button>
</form>
<script>
$('#myForm').submit(function(e) {
e.preventDefault();
$.ajax({
type: 'POST',
url: '/your-endpoint',
data: $(this).serialize(),
success: function(response) {
console.log(response);
}
});
});
</script>
<meta name="csrf-token" content="{{ csrf_token() }}">
<script>
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
type: 'POST',
url: '/your-endpoint',
data: {key: 'value'},
success: function(response) {
console.log(response);
}
});
</script>
let token = '{{ csrf_token() }}';
$.ajax({
type: 'POST',
url: '/your-endpoint',
data: {
_token: token,
key: 'value'
},
success: function(response) {
console.log(response);
}
});
如果构建的是SPA应用,可以使用Laravel Sanctum:
axios.get('/sanctum/csrf-cookie').then(response => {
// 现在可以发起认证请求
axios.post('/login', {
email: 'user@example.com',
password: 'password'
});
});
X-CSRF-TOKEN
或_token
字段.env
文件中SESSION_DOMAIN
正确设置config/session.php
中的配置app/Http/Middleware/VerifyCsrfToken.php
中添加:protected $except = [
'stripe/*',
'webhook/*'
];
通过以上方法,可以解决Laravel中AJAX请求的令牌不匹配问题,确保应用的安全性和功能性。
没有搜到相关的文章