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