2021-01-27 分類(lèi): 網(wǎng)站建設(shè)
一、準(zhǔn)備
兩臺(tái)服務(wù)器:
一臺(tái)前端html服務(wù)器 http://admin.tp_mall.com
一臺(tái)后端獲取數(shù)據(jù)及redis數(shù)據(jù)庫(kù)服務(wù)器 http://api.tp_mall.com
后端php框架:thinkphp5.1
jsonp
二、流程及原理
用戶(hù)登錄頁(yè) http://admin.tp_mall.com/login/login.html
ajax表單提交登錄
登錄成功將id、uname、usalt、loginTime通過(guò)aes對(duì)稱(chēng)加密生成token
將token寫(xiě)入redis數(shù)據(jù)庫(kù)(設(shè)置過(guò)期時(shí)間)
ajax返回token及用戶(hù)名和頭像(便于顯示)、并且寫(xiě)入cookie
跳轉(zhuǎn)首頁(yè)并發(fā)送攜帶token的ajax請(qǐng)求數(shù)據(jù)
新建一個(gè)tp框架中間件AdminLoginCheck.php 攔截http請(qǐng)求來(lái)判斷是否登錄
token有效且未過(guò)期表示已登錄,通過(guò)中間件到達(dá)控制器返回?cái)?shù)據(jù)給頁(yè)面
刷新redis中的loginTime維持登錄狀態(tài)
token無(wú)效或已過(guò)期標(biāo)識(shí)未登錄,返回狀態(tài)并重定向到登錄頁(yè)
三、主要代碼
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過(guò)期時(shí)間
$redisTokenArr[count($redisTokenArr) - 1] = time();
$newToken = $aes->encrypt(implode(' ', $redisTokenArr));
if (!$redis->set($key, $newToken, 7200)) {
$ret = [
'sta' => -2,
'mes' => '寫(xiě)入redis中token過(guò)期時(shí)間失敗!',
];
echo $jsonp.'('.json_encode($ret).')';
die;
}
} else {
//未登錄 終止程序
$ret = [
'sta' => -1,
'mes' => '請(qǐng)重新登錄!',
];
echo $jsonp.'('.json_encode($ret).')';
die;
}
return $next($request);
}
設(shè)置redis過(guò)期時(shí)間
/**
* 設(shè)置用戶(hù)token的redis過(guò)期時(shí)間
*
* @param [type] $info 用戶(hù)身份信息
* @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;
}
四、詳細(xì)
詳細(xì)請(qǐng)移步至我的github
(前端)https://github.com/zyddj123/mall_html
(后端)https://github.com/zyddj123/tp_mall
文章名稱(chēng):解決前后端分離、跨域等問(wèn)題的一個(gè)實(shí)例
鏈接URL:http://www.bm7419.com/news/97754.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、網(wǎng)站內(nèi)鏈、網(wǎng)站改版、企業(yè)網(wǎng)站制作、虛擬主機(jī)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容