最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js項目中前端如何實現(xiàn)無感刷新token

 更新時間:2023年07月14日 11:22:21   作者:fly_dream  
本文主要介紹了js項目中前端如何實現(xiàn)無感刷新token,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前一陣遇到了一個問題,線上平臺有時會出現(xiàn)用戶正在使用的時候,突然要用戶去進(jìn)行登錄,這樣會造成很不好的用戶體驗,但是當(dāng)時一直沒有好的思路因此擱置了下來;通過零散時間查詢資料以及思考,最終解決了這個問題,接下來跟大家分享一下!

環(huán)境

  • 請求采用的 Axios V1.3.2。
  • 平臺的采用的 JWT(JSON Web Tokens) 進(jìn)行用戶登錄鑒權(quán)。
    (拓展:JWT 是一種認(rèn)證機(jī)制,讓后臺知道該請求是來自于受信的客戶端;更詳細(xì)的可以自行查詢相關(guān)資料)

問題現(xiàn)象

線上用戶在使用的時候,偶爾會出現(xiàn)突然跳轉(zhuǎn)到登錄頁面,需要重新登錄的現(xiàn)象。

原因

  • 突然跳轉(zhuǎn)到登錄頁面,是由于當(dāng)前的 token 過期,導(dǎo)致請求失敗;在 axios 的響應(yīng)攔截axiosInstance.interceptors.response.use中處理失敗請求返回的狀態(tài)碼 401,此時得知token失效,因此跳轉(zhuǎn)到登錄頁面,讓用戶重新進(jìn)行登錄。
  • 平臺目前的邏輯是在 token 未過期內(nèi),用戶登錄平臺可直接進(jìn)入首頁,無需進(jìn)行登錄操作;因此就存在該現(xiàn)象:用戶打開平臺,由于此時 token 未過期,用戶直接進(jìn)入到了首頁,進(jìn)行其他操作。但是在用戶操作的過程中,token 突然失效了,此時就會出現(xiàn)突然跳轉(zhuǎn)到登錄頁面,嚴(yán)重影響用戶的體驗感!
    注:目前線上項目中存在數(shù)據(jù)大屏,一些實時數(shù)據(jù)的顯示;因此存在用戶長時間停留在大屏頁面,不進(jìn)行操作,查看實時數(shù)據(jù)的情況

切入點

  • 怎樣及時的、在用戶感知不到的情況下更新token
  • 當(dāng) token 失效的情況下,出錯的請求可能不僅只有一個;當(dāng)失效的 token 更新后,怎樣將多個失敗的請求,重新發(fā)送?

操作流程

好了!經(jīng)過了一番分析后,我們找到了問題的所在,并且確定了切入點;那么接下來讓我們實操,將問題解決掉。

前要:

1、我們僅從前端的角度去處理。
2、后端提供了兩個重要的參數(shù):accessToken(用于請求頭中,進(jìn)行鑒權(quán),存在有效期);refreshToken(刷新令牌,用于更新過期的 accessToken,相對于 accessToken 而言,它的有效期更長)。

1、處理 axios 響應(yīng)攔截

注:在我實際的項目中,accessToken 過期后端返回的 statusCode 值為 401,需要在axiosInstance.interceptors.response.useerror回調(diào)中進(jìn)行邏輯處理。

// 響應(yīng)攔截
axiosInstance.interceptors.response.use(
  (response) => {
    return response;
  },
  (error) => {
    let {
      data, config
    } = error.response;
    return new Promise((resolve, reject) => {
      /**
       * 判斷當(dāng)前請求失敗
       * 是否由 toekn 失效導(dǎo)致的
       */
      if (data.statusCode === 401) {
         /**
         * refreshToken 為封裝的有關(guān)更新 token 的相關(guān)操作 
         */
        refreshToken(() => {
          resolve(axiosInstance(config));
        });
      } else {
        reject(error.response);
      }
    })
  }
)
  • 我們通過判斷statusCode來確定,是否當(dāng)前請求失敗是由token過期導(dǎo)致的;
  • 使用 Promise 處理將失敗的請求,將由于 token 過期導(dǎo)致的失敗請求存儲起來(存儲的是請求回調(diào)函數(shù),resolve 狀態(tài))。理由:后續(xù)我們更新了 token 后,可以將存儲的失敗請求重新發(fā)起,以此來達(dá)到用戶無感的體驗

2、封裝 refreshToken 邏輯

要點:

  • 存儲由于token過期導(dǎo)致的失敗的請求。
  • 更新本地以及axios中頭部的token。
  • 當(dāng) refreshToken 刷新令牌也過期后,讓用戶重新登錄。
// 存儲由于 token 過期導(dǎo)致 失敗的請求
let expiredRequestArr: any[] = [];
/**
 * 存儲當(dāng)前因為 token 失效導(dǎo)致發(fā)送失敗的請求
 */
const saveErrorRequest = (expiredRequest: () => any) => {
  expiredRequestArr.push(expiredRequest);
}
// 避免頻繁發(fā)送更新 
let firstRequre = true;
/**
 * 利用 refreshToken 更新當(dāng)前使用的 token
 */
const updateTokenByRefreshToken = () => {
  firstRequre = false;
  axiosInstance.post(
    '更新 token 的請求',
  ).then(res => {
    let {
      refreshToken, accessToken
    } = res.data;
    // 更新本地的token
    localStorage.setItem('accessToken', accessToken);
    // 更新請求頭中的 token
    setAxiosHeader(accessToken);
    localStorage.setItem('refreshToken', refreshToken);
    /**
     * 當(dāng)獲取了最新的 refreshToken, accessToken 后
     * 重新發(fā)起之前失敗的請求
     */
    expiredRequestArr.forEach(request => {
      request();
    })
    expiredRequestArr = [];
  }).catch(err => {
    console.log('刷新 token 失敗err', err);
    /**
     * 此時 refreshToken 也已經(jīng)失效了
     * 返回登錄頁,讓用戶重新進(jìn)行登錄操作
     */
    window.location.href = `${HOME_PAGE}/login`;
  })
}
/**
 * 更新當(dāng)前已過期的 token
 * @param expiredRequest 回調(diào)函數(shù),返回由token過期導(dǎo)致失敗的請求
 */
export const refreshToken = (expiredRequest: () => any) => {
  saveErrorRequest(expiredRequest);
  if (firstRequre) {
    updateTokenByRefreshToken();
  }
}

總結(jié)

經(jīng)過一波分析以及操作,我們最終實現(xiàn)了實際項目中的無感刷新token,最主要的是有效避免了:用戶在平臺操作過程中突然要退出登錄的現(xiàn)象(尤其是當(dāng)用戶進(jìn)行信息填寫,突然要重新登錄,之前填寫的信息全部作廢,是很容易讓人發(fā)狂的)。

到此這篇關(guān)于js項目中前端如何實現(xiàn)無感刷新token的文章就介紹到這了,更多相關(guān)js 無感刷新token內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解JavaScript定時機(jī)制

    深入理解JavaScript定時機(jī)制

    JavaScript的setTimeout與setInterval是兩個很容易欺騙別人感情的方法,因為我們開始常常以為調(diào)用了就會按既定的方式執(zhí)行, 我想不少人都深有同感
    2010-10-10
  • javascript模擬評分控件實現(xiàn)方法

    javascript模擬評分控件實現(xiàn)方法

    這篇文章主要介紹了javascript模擬評分控件實現(xiàn)方法,涉及javascript操作頁面元素與樣式的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • JavaScript實現(xiàn)美化滑塊效果

    JavaScript實現(xiàn)美化滑塊效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)美化滑塊效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 理解Javascript_02_理解undefined和null

    理解Javascript_02_理解undefined和null

    其實在 ECMAScript 的原始類型中,是有Undefined 和 Null 類型的。 這兩種類型都分別對應(yīng)了屬于自己的唯一專用值,即undefined 和 null。
    2010-10-10
  • JavaScript雙問號操作符(??)的驚人用法總結(jié)大全

    JavaScript雙問號操作符(??)的驚人用法總結(jié)大全

    雙問號操作符是ES2020引入的一個用于處理變量默認(rèn)值的新特性,與傳統(tǒng)的邏輯或操作符||不同,這篇文章主要介紹了JavaScript雙問號操作符(??)詳解及如何解決使用||時因類型轉(zhuǎn)換帶來的問題,需要的朋友可以參考下
    2025-04-04
  • javascript 中的console.log和彈出窗口alert

    javascript 中的console.log和彈出窗口alert

    這篇文章主要介紹了javascript 中的console.log和彈出窗口alert 的相關(guān)資料,非常不錯,具有參考借鑒價值,感興趣的朋友參考下吧
    2016-08-08
  • 求數(shù)組最大最小值方法適用于任何數(shù)組

    求數(shù)組最大最小值方法適用于任何數(shù)組

    之前雖然介紹過一種求數(shù)組最大最小值的方法,但那個方法只是用于數(shù)組中都是數(shù)字的,下面為大家介紹個方法適用于任何數(shù)組,有此需求的朋友可以參考下
    2013-08-08
  • JavaScript實現(xiàn)非常簡單實用的下拉菜單效果

    JavaScript實現(xiàn)非常簡單實用的下拉菜單效果

    這篇文章主要介紹了JavaScript實現(xiàn)非常簡單實用的下拉菜單效果,通過定義顯示及隱藏菜單項及鼠標(biāo)事件調(diào)用該函數(shù)實現(xiàn)下拉菜單功能,需要的朋友可以參考下
    2015-08-08
  • 如何基于javascript實現(xiàn)貪吃蛇游戲

    如何基于javascript實現(xiàn)貪吃蛇游戲

    這篇文章主要介紹了如何基于javascript實現(xiàn)貪吃蛇游戲,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • JS使用Prim算法和Kruskal算法實現(xiàn)最小生成樹

    JS使用Prim算法和Kruskal算法實現(xiàn)最小生成樹

    這篇文章主要為大家詳細(xì)介紹了JS使用Prim算法和Kruskal算法實現(xiàn)最小生成樹,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論

宣武区| 塔河县| 二连浩特市| 新野县| 富裕县| 陕西省| 调兵山市| 吴堡县| 永登县| 和顺县| 板桥市| 来凤县| 任丘市| 芦溪县| 绥滨县| 磐石市| 余干县| 延庆县| 上虞市| 尖扎县| 丹东市| 阜新市| 柳州市| 乌什县| 新河县| 中西区| 墨脱县| 佳木斯市| 宜兰市| 河东区| 长治市| 章丘市| 琼海市| 宝兴县| 白朗县| 额尔古纳市| 新化县| 宜春市| 太谷县| 遵义市| 无极县|