1、本场景仅介绍复杂一点的ajax请求带上token验证,普通的form提交不讲
2、原理仅个人理解,如有偏差 欢迎各路大神指点:框架tp5.0.18
目前将token放置于 ajax的header头部,发现在后台验证时候,一直报错【验证令牌不存在】。
故将token放置于 ajax的data参数中。
后台每进行一次ajax提交,均需要进行token重新生成、替换,不管成功与否。(强烈建议阅读token生成源码:request.php的token()方法)
3、jquery代码:【每次ajax接受到的新token,先赋值给隐藏域变量__token__,然后再从该变量取值】
<script type="text/javascript">
$(document).on("click",".more",function(){
var jm_product_code = $(this).attr("data-id");
var token = $("input[name='__token__']").val();
$.ajax({
url:"{:url('admin/DingReport/ajax')}",
dataType:'JSON',
type:'POST',
data:{'jm_product_code':jm_product_code,'__token__':token},
success: function(data, status, xhr) {
console.log(data);
$("input[name='__token__']").val(data.__token__);
}
})
})
</script>
4、tp5
public function ajax(){
if($this->request->isGet()) die;
$rule= [
'jm_product_code'=>'require',
'__token__' => 'token', //在需要表单token的地方加入令牌验证
];
$message= [
'jm_product_code.require'=>'商品编码不能为空!',
];
$validate=new \think\Validate($rule,$message);
if( true !== $validate->check(input())){
$data = [
'__token__'=>request()->token(),
'code'=>0,
'info'=>$validate->getError(),
];
}else{
$data = [
'__token__'=>request()->token(),
'code'=>1,
'info'=>'successfully',
];
}
echo json_encode($data,JSON_UNESCAPED_UNICODE);
}
6、坏处:每次请求(无论验证成功与否)都会生成新的token,可能与tp5的验证思想不符合;
反正我也尝试了 自动获取ajax返回头,xhr.getReposeheader("__token__"),but 每次都null 。
既然如此,只能手动生成了。
来源:https://www.cnblogs.com/xuzhengzong/p/9487557.html