【tp5】表单验证之token

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 。

     既然如此,只能手动生成了。

 

posted @ 2018-08-16 15:25  PHP急先锋  阅读(8439)  评论(0编辑  收藏  举报