鍍金池/ 問答/Java  PHP  HTML/ thinkphp5 ajax提交token更新的問題

thinkphp5 ajax提交token更新的問題

在使用thinkphp5做編輯刪除的ajax操作時,攜帶token。點擊第一次時驗證器提示成功,點擊第二次時提示無效的令牌。后來發(fā)現(xiàn)原因是因為var token='{$Request.token}';這里的值沒變所以導(dǎo)致令牌驗證失敗。現(xiàn)在在控制器中$request->token();重新生成了token并已header形式返回到客戶端,但是如何讓ajax提交時的token為新的值呢?我的代碼改如何修改,謝謝
附:我的代碼:

html部分:

                <tr>
                    <td></td>
                    <td>1</td>
                    <td>yxg</td>
                    <td>$1</td>
                    <td>
                        <div class="btn-group" role="group" aria-label="...">
                          <button type="button" class="btn btn-info editTag" onclick=editOne('{:url("index/index/delmulti")}','1');>編輯</button>
                          <button type="button" class="btn btn-danger deleteTag" onclick="delOne('url',1);">刪除</button>
                        </div>
                    </td>
                </tr>

jquery部分:

        function editOne(url,id){
            // 第一生成token
            var token='{$Request.token}';
            var xhr=$.ajax({
                url:url,
                type:"POST",
                dataType:"text",
                data:{'id':1,'__token__':token},
            })
            .done(function(data) {
                // token=xhr.getResponseHeader("__token__");
                console.log(data);
                console.log(xhr.getResponseHeader("__token__"));
            })
            .fail(function() {
                alert(data.msg);
            })
            .always(function() {
                console.log("complete");
            });
        }

thinkphp控制器部分:

    public function delmulti(){
        $request = \think\Request::instance();
        $data=$_POST;
        $validate=new Validate([
            'id'=>'require|token',
        ]);
        if(!$validate->check($data)){
            // 重新生成token返回
            $request->token();
            $res['msg']=$validate->getError();
            $jres=json_encode($res,JSON_UNESCAPED_UNICODE);
            echo($jres);
        }else{
            // 重新生成token返回
            $request->token();
            $res['msg']='success';
            $jres=json_encode($res,JSON_UNESCAPED_UNICODE);
            echo($jres);
        }
    }
回答
編輯回答
薔薇花

需要刷新html頁面才能生成新的token。
你可以在后端寫一個生成token的function,在提交表單的時候先使用ajax訪問該function獲取新的token,再將這個token提交上去

    //php
    function createToken(){
        return $request->token();
    }
    
    
    //jq
    function getToken(){
        var token = null;
        $.ajax({
            url:'createToken',
            type:"get",
            async: false,
            dataType:"json",
            success function(data){
                token = data;
            }
        });
        
        return token;
    }
    
    function editOne(url,id){
        // 第一生成token
        var token=getToken();
        var xhr=$.ajax({
            url:url,
            type:"POST",
            dataType:"text",
            data:{'id':1,'__token__':token},
        })
        .done(function(data) {
            // token=xhr.getResponseHeader("__token__");
            console.log(data);
            console.log(xhr.getResponseHeader("__token__"));
        })
        .fail(function() {
            alert(data.msg);
        })
        .always(function() {
            console.log("complete");
        });
    }
2017年11月20日 11:27