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 。
既然如此,只能手动生成了。