亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

徹底前后端分離、解決跨域等問題demo

來源:清晨一場夢 發(fā)布時(shí)間:2019-04-19 15:53:25 閱讀量:1318

一、準(zhǔn)備

兩臺服務(wù)器:

 

一臺前端html服務(wù)器 http://admin.tp_mall.com

一臺后端獲取數(shù)據(jù)及redis數(shù)據(jù)庫服務(wù)器 http://api.tp_mall.com

后端php框架:thinkphp5.1

 

jsonp

 

二、流程及原理

用戶登錄頁 http://admin.tp_mall.com/login/login.html

ajax表單提交登錄

登錄成功將id、uname、usalt、loginTime通過aes對稱加密生成token

token寫入redis數(shù)據(jù)庫(設(shè)置過期時(shí)間)

ajax返回token及用戶名和頭像(便于顯示)、并且寫入cookie

跳轉(zhuǎn)首頁并發(fā)送攜帶token的ajax請求數(shù)據(jù)

新建一個(gè)tp框架中間件AdminLoginCheck.php 攔截http請求來判斷是否登錄

token有效且未過期表示已登錄,通過中間件到達(dá)控制器返回?cái)?shù)據(jù)給頁面

刷新redis中的loginTime維持登錄狀態(tài)

token無效或已過期標(biāo)識未登錄,返回狀態(tài)并重定向到登錄頁

三、主要代碼

AdminLoginCheck中間件主要代碼

public function handle($request, \Closure $next)

{

        $jsonp = $request->param('callback');

        $token = $request->param('token');

        $aes = new Aes('zyddj123');

        $tokenValue = $aes->decrypt($token);

        $tokenArr = explode(' ', $tokenValue);

        $key = 'adminToken_'.$tokenArr[0];

        $redis = new Redis();

        $redisToken = $redis->get($key);

        $redisTokenValue = $aes->decrypt($redisToken);

        $redisTokenArr = explode(' ', $redisTokenValue);

        if ($redisTokenArr[0] == $tokenArr[0] && $redisTokenArr[1] == $tokenArr[1] && $redisTokenArr[2] == $tokenArr[2] && intval($redisTokenArr[count($redisTokenArr) - 1]) + 7200 > time()) {

            //已經(jīng)登錄  刷新redis中token過期時(shí)間

            $redisTokenArr[count($redisTokenArr) - 1] = time();

            $newToken = $aes->encrypt(implode(' ', $redisTokenArr));

            if (!$redis->set($key, $newToken, 7200)) {

                $ret = [

                    'sta' => -2,

                    'mes' => '寫入redis中token過期時(shí)間失敗!',

                ];

                echo $jsonp.'('.json_encode($ret).')';

                die;

            }

        } else {

            //未登錄  終止程序

            $ret = [

                'sta' => -1,

                'mes' => '請重新登錄!',

            ];

            echo $jsonp.'('.json_encode($ret).')';

            die;

        }

        return $next($request);

}

設(shè)置redis過期時(shí)間

/**

     * 設(shè)置用戶token的redis過期時(shí)間

     *

     * @param [type] $info  用戶身份信息

     * @return $token or false

     */

    public static function setRedisExpire($info)

    {

        $aes = new Aes('zyddj123');

        $redis = new Redis();

        $tokenValue = [

            'id'=>$info['id'],

            'uname'=>$info['uname'],

            'usalt'=>$info['usalt'],

            'loginTime'=>time()

        ];

        $token = $aes->encrypt(implode(" ",$tokenValue));

        $key = 'adminToken_'.$info['id'];

        return $redis->set($key,$token,7200)?$token:false;

    }


標(biāo)簽: PHP 環(huán)境搭建
分享:
評論:
你還沒有登錄,請先