鍍金池/ 問(wèn)答/Java  PHP  HTML/ tp5 ajax token令牌的問(wèn)題

tp5 ajax token令牌的問(wèn)題

在用thinkphp5做項(xiàng)目的時(shí)候,ajax提交為了安全攜帶token,但是遇到一個(gè)問(wèn)題,以編輯按鈕為例,一個(gè)頁(yè)面只有第一次點(diǎn)擊的時(shí)候是成功的,第二次點(diǎn)擊時(shí)就會(huì)提示令牌錯(cuò)誤.
前端代碼:

                <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>
                        </div>
                    </td>
                </tr>
                <tr>
                    <td></td>
                    <td>2</td>
                    <td>abc</td>
                    <td>$2</td>
                    <td>
                        <div class="btn-group" role="group" aria-label="...">
                          <button type="button" class="btn btn-info editTag"  onclick=editOne('{:url("index/index/delmulti")}','2');>編輯</button>
                        </div>
                    </td>                
                </tr>
                /*------------------jquery的代碼------------*/
                /*ajax 提交封裝函數(shù) 集成torken */
        function editOne(url,id){
            
            var token='{$Request.token}';
            $.ajax({
                url:url,
                type:"POST",
                dataType:"text",
                data:{'id':1,'__token__':token},
            })
            .done(function(data) {

                console.log(data);
            })
            .fail(function() {
                alert(data.msg);
            })
            .always(function() {
                console.log("complete");
            });
        }

控制器中的處理代碼:

    public function delmulti(){
        session_id()||session_start();
        $request = \think\Request::instance();
        $data=$_POST;
        echo $_SESSION['think']['__token__'];
        $validate=new Validate([
            'id'=>'require|token',
        ]);
        if(!$validate->check($data)){
            $res['msg']=$validate->getError();
            $res['session']=$_SESSION['think'];
            $res['token']=$_POST['__token__'];
            $res['newtoken']= $request->token();
            $jres=json_encode($res,JSON_UNESCAPED_UNICODE);
            echo($jres);
        }else{
            $res['msg']='success';
            $res['session']=$_SESSION['think'];
            $res['token']=$_POST['__token__'];
            $res['newtoken']= $request->token();
            $jres=json_encode($res,JSON_UNESCAPED_UNICODE);
            echo($jres);
        }
    }

根據(jù)網(wǎng)上的幫助,發(fā)現(xiàn)問(wèn)題的原因在于ajax的token沒有更新,使用完后需要在頁(yè)面中動(dòng)態(tài)更新token的值.我現(xiàn)在在控制器中返回了新的token值,怎么才能讓ajax提交時(shí)使用新的token值了?

回答
編輯回答
薔薇花

thinkphp5 生成token方法,ajax請(qǐng)求該地址,不刷新獲取新的token
/**

 * 生成token函數(shù)
 * @return [json] [description]
 */
public function getToken(){
    $request = \think\Request::instance();
    echo  $request->token();
}
2017年5月11日 15:14