Ajax如果使用get是能正常提交和获取数据的,但是使用post的时候就是403 Forbidden。同时,配置app里面是开启了csrf验证的。
关闭csrf或排除提交页面地址的方式解决是可行的。但是,即想开着csrf认证,又想要用ajax post,可以试试这个办法。
其实可以看看用户发送令牌的顺序,检查CSRF令牌可用性的顺序如下:
- $_POST array (例如: <input type="hidden" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" />).
- HTTP头(即:X-CSRF-TOKEN: ccd8facfa8229bdba5e0160c108d1a02)。
- php://input(JSON请求)——请记住,这种方法是最慢的,因为我们必须先解码JSON,然后再re-encode它。(即:{"csrf_cookie_name": "ccd8facfa8229bdba5e0160c108d1a02"})
您可以手动完成它。例如:在PHP视图模板中,使用Ajax时写上下面这句:
headers: { "<?php echo csrf_header();?>": "<?php echo csrf_hash();?>"}
然后就解决post 403 403 Forbidden了。
$.ajax({
url:"/xxx/test",
type: "POST",
dataType:"json",
headers: {"<?php echo csrf_header();?>": "<?php echo csrf_hash();?>","X-Requested-With": "XMLHttpRequest"},
contentType: "application/json; charset=utf-8",
data:{data:postData},
success:function(data){
alert(data.result);
console.log(data);
},
error: function(data) {
alert(data);
console.log(data);
},
});