關(guān)于Vue 消除Token過期時(shí)刷新頁面的重復(fù)提示問題
token過期時(shí),刷新頁面,頁面如果加載時(shí)向后端發(fā)起多個請求,會重復(fù)告警提示,經(jīng)過處理,只提示一次告警。
1、問題現(xiàn)象
頁面長時(shí)間未操作,再刷新頁面時(shí),第一次彈出“token失效,請重新登錄!”提示,然后跳轉(zhuǎn)到登錄頁面,接下來又彈出了n個“Token已過期”的后端返回消息提示。
2、原因分析
當(dāng)前頁面初始化,有多個向后端查詢系統(tǒng)參數(shù)的調(diào)用,代碼如下:
created () {
// ========================================================================
// 獲取需要的系統(tǒng)參數(shù),注意:getParameterClass方法是異步加載數(shù)據(jù)的。
// 如需要打印觀察,需要通過watch來處理
// 獲取用戶類型的參數(shù)類別
this.commonFuncs.getParameterClass(this,"user_type","userTypeList","userTypeMap");
// 獲取用戶狀態(tài)的參數(shù)類別
for(var i = 0; i < this.userStatusList.length; i++){
var item = this.userStatusList[i];
var mapKey = parseInt(item.itemKey);
this.userStatusMap.set(mapKey, item);
}
// 獲取性別的參數(shù)類別
this.commonFuncs.getParameterClass(this,"gender","","genderMap");
// 獲取部門的參數(shù)類別
this.commonFuncs.getParameterClass(this,"department","","deptMap");
// 獲取角色的參數(shù)類別
this.commonFuncs.getParameterClass(this,"role","","roleMap");
// 查詢用戶記錄
this.queryUsers();
},
這些請求,是axios調(diào)用,是異步執(zhí)行的,因此,刷新頁面時(shí),這些請求幾乎立即就發(fā)出了。然后,這些請求的響應(yīng)會陸續(xù)返回。
響應(yīng)首先被下面的response攔截器處理:
// token相關(guān)的response攔截器
instance.interceptors.response.use(response => {
if (response) {
switch (response.data.code) {
case 3: //token為空
case 4: //token過期
case 5: //token不正確
localStorage.clear(); //刪除用戶信息
alert('token失效,請重新登錄!');
// 要跳轉(zhuǎn)登陸頁
router.replace({
path: '/login',
});
break;
case 6: //禁止訪問
// 跳到403頁面
router.replace({
path: '/forbidden',
});
break;
default:
break;
}
}
return response;
}, error => {
return Promise.reject(error.response.data.message) //返回接口返回的錯誤信息
})
然后再進(jìn)入請求調(diào)用處的代碼:
this.instance.getParameterClass(
this.$baseUrl, {"classKey" : classKey}
).then(res => {
//console.log(res.data);
if (res.data.code == parent.global.SucessRequstCode){
// 如果查詢成功
// 成功的處理代碼...
}else{
alert(res.data.message);
}
}).catch(error => {
//alert('查詢系統(tǒng)參數(shù)失?。?);
console.log(error);
});
現(xiàn)在的問題:
對應(yīng)一個請求,如果token過期,reponse攔截器首先彈出告警提示,然后,調(diào)用處又有提示:
alert(res.data.message);
這樣就重復(fù)了。
對于同時(shí)發(fā)出的多個請求,需要有標(biāo)記來記住這次token過期是否已提示,只提示一次,如已提示,就不必再提示。
3、解決方案
3.1、消除攔截器和請求調(diào)用處對token過期的重復(fù)提示
編寫一個公共方法,檢查是否是被攔截處理的返回碼,放于/src/common/commonFuncs.js文件中,代碼如下:
/**
* 判斷是否被攔截處理的返回碼,返回true,表示被攔截
* 此方法的作用是調(diào)用處,無需處理被攔截的返回碼的錯誤提示
* @param {請求的返回碼} code
*/
isInterceptorCode(code){
switch (code) {
case 3: //token為空
case 4: //token過期
case 5: //token不正確
case 6: //禁止訪問
return true;
default:
break;
}
return false;
}
然后所有調(diào)用處,針對非成功返回的處理均改為:
if (!this.commonFuncs.isInterceptorCode(res.data.code)){
alert(res.data.message);
}
這樣,消除了攔截處理和調(diào)用處理的重復(fù)告警。
3.2、多個請求只提示一次的處理
在全局變量文件/src/common/global.js中,增加token無效標(biāo)記,代碼如下:
//全局變量
export default {
// 請求成功返回碼
SucessRequstCode:0,
// token無效標(biāo)記
TokenInvalidFlag : 0
}
然后,修改攔截器代碼:
// token相關(guān)的response攔截器
instance.interceptors.response.use(response => {
if (response) {
switch (response.data.code) {
case 0: //正常
// 復(fù)位token無效標(biāo)記置
global.TokenInvalidFlag = 0;
break;
case 3: //token為空
case 4: //token過期
case 5: //token不正確
localStorage.clear(); //刪除用戶信息
if (global.TokenInvalidCounter == 0){
alert('token失效,請重新登錄!');
}
// token無效標(biāo)記置1
global.TokenInvalidFlag = 1;
// 要跳轉(zhuǎn)登陸頁
router.replace({
path: '/login',
});
break;
case 6: //禁止訪問
// 跳到403頁面
router.replace({
path: '/forbidden',
});
break;
default:
break;
}
}
return response;
}, error => {
return Promise.reject(error.response.data.message) //返回接口返回的錯誤信息
})
即在第一次收到token過期消息(此時(shí)TokenInvalidFlag=0)時(shí),進(jìn)行提示,然后設(shè)置為1(此時(shí)TokenInvalidFlag=1),后續(xù)的若干個請求的響應(yīng),都不會在告警提示了。直到收到成功返回碼時(shí)復(fù)位為0,此時(shí)表示重新登錄成功了。
經(jīng)測試,這樣處理達(dá)到預(yù)期效果,即token過期時(shí),刷新頁面,只提示一次告警。
作者:阿拉伯1999 出處:http://www.cnblogs.com/alabo1999/ 本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利. 養(yǎng)成良好習(xí)慣,好文章隨手頂一下。
到此這篇關(guān)于Vue 消除Token過期時(shí)刷新頁面的重復(fù)提示的文章就介紹到這了,更多相關(guān)Vue刷新頁面的重復(fù)提示內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue中雙token和無感刷新token的區(qū)別
- Vue實(shí)現(xiàn)雙token無感刷新的示例代碼
- vue2實(shí)現(xiàn)無感刷新token的方式詳解
- VUE前端實(shí)現(xiàn)token的無感刷新方式
- vuex刷新頁面丟失登錄token信息的解決方案
- Vue項(xiàng)目實(shí)現(xiàn)token無感刷新的示例代碼
- 前端使用vue實(shí)現(xiàn)token無感刷新的三種方案解析
- Vue3+Vite使用雙token實(shí)現(xiàn)無感刷新
- vue的token刷新處理的方法
- Vue項(xiàng)目中實(shí)現(xiàn)無感Token刷新的示例
相關(guān)文章
electron-vue中報(bào)錯Cannot?use?import?statement?outside?a?m
Electron 是一個使用 JavaScript、HTML 和 CSS 構(gòu)建桌面應(yīng)用程序的框架,下面這篇文章主要給大家介紹了關(guān)于electron-vue中報(bào)錯Cannot?use?import?statement?outside?a?module的解決方案,需要的朋友可以參考下2023-02-02
vue結(jié)合leaflet實(shí)現(xiàn)熱力圖
本文主要介紹了vue實(shí)現(xiàn)熱力圖,結(jié)合leaflet.heat插件可以很容易的做出熱力圖,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Vue函數(shù)式組件的應(yīng)用實(shí)例詳解
這篇文章主要介紹了Vue函數(shù)式組件的應(yīng)用實(shí)例詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
詳解如何使用webpack在vue項(xiàng)目中寫jsx語法
本篇文章主要介紹了詳解如何使用webpack在vue項(xiàng)目中寫jsx語法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11

