欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue的token刷新處理的方法

 更新時間:2018年07月17日 14:38:46   作者:Paranoidyang  
這篇文章主要介紹了vue的token刷新處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

第一次接觸token處理,初來乍到,說錯的地方還請各位多多指教。

token身份驗證機制

客戶端登錄請求成功后,服務(wù)器將用戶信息(如用戶id)使用特殊算法加密后作為驗證的標志發(fā)送給用戶(即token),當用戶下次發(fā)起請求時,會將這個token捎帶過來,服務(wù)器再將這個token通過解密后進行驗證,通過的話,則向客戶端返回請求的數(shù)據(jù);反之,則請求失敗。

token優(yōu)點

它是無狀態(tài)的,且服務(wù)器不用像傳統(tǒng)的身份認證(session)那樣需要保存會話信息,減輕了服務(wù)器的壓力。

vue的token刷新處理

在對token身份驗證機制進行一次簡單介紹后,進入正文...

一般為了安全性,token都會設(shè)置一個過期時間,在過期之后就無法請求相關(guān)接口了,這時應(yīng)該怎么辦呢,是直接退出登錄嗎?

在目前公司的項目里,為了更好的用戶體驗,我們選擇手動刷新token。登錄請求成功后,會返回一個token和token過期時間,在每次請求api時,前端可以先判斷一下token是否即將過期或已過期,如果是,則請求刷新token的接口,成功替換原來的token之后才可以重新發(fā)起請求。

下面,我們直接看代碼,這是在vue的請求攔截器里進行的相關(guān)操作:

/*是否有請求正在刷新token*/
window.isRefreshing = false
/*被掛起的請求數(shù)組*/
let refreshSubscribers = []

/*獲取刷新token請求的token*/
function getRefreshToken () {
 return JSON.parse(localStorage.auth).refresh_token
}

/*push所有請求到數(shù)組中*/
function subscribeTokenRefresh (cb) {
 refreshSubscribers.push(cb)
}

/*刷新請求(refreshSubscribers數(shù)組中的請求得到新的token之后會自執(zhí)行,用新的token去請求數(shù)據(jù))*/
function onRrefreshed (token) {
 refreshSubscribers.map(cb => cb(token))
}

/*請求攔截器*/
ajax.interceptors.request.use(
 config => {
  const authTmp = localStorage.auth
  /*判斷是否已登錄*/
  if (authTmp) {
   /*解析登錄信息*/
   let auth = JSON.parse(authTmp)
   /*判斷auth是否存在*/
   if (auth) {
    /*在請求頭中添加token類型、token*/
    config.headers.Authorization = auth.token_type + ' ' + auth.token
    /*判斷刷新token請求的refresh_token是否過期*/
    if (util.isRefreshTokenExpired()) {
     alert('刷新token過期,請重新登錄')
     /*清除本地保存的auth*/
     localStorage.removeItem('auth')
     window.location.href = '#/login'
     return
    }
    /*判斷token是否將要過期*/
    if (util.isTokenExpired() && config.url.indexOf('admin/auth/current') === -1) {
     /*判斷是否正在刷新*/
     if (!window.isRefreshing) {
      /*將刷新token的標志置為true*/
      window.isRefreshing = true
      /*發(fā)起刷新token的請求*/
      apiList.refreshToken({refresh_token: getRefreshToken()}).then(res => {
       /*將標志置為false*/
       window.isRefreshing = false
       /*成功刷新token*/
       config.headers.Authorization = res.data.data.token_type + ' ' + res.data.data.token
       /*更新auth*/
       localStorage.setItem('auth', JSON.stringify(res.data.data))
       /*執(zhí)行數(shù)組里的函數(shù),重新發(fā)起被掛起的請求*/
       onRrefreshed(res.data.data.token)
       /*執(zhí)行onRefreshed函數(shù)后清空數(shù)組中保存的請求*/
       refreshSubscribers = []
      }).catch(err => {
       alert(err.response.data.message)
       /*清除本地保存的auth*/
       // localStorage.removeItem('auth')
       window.location.href = '#/login'
      })
     }
     /*把請求(token)=>{....}都push到一個數(shù)組中*/
     let retry = new Promise((resolve, reject) => {
      /*(token) => {...}這個函數(shù)就是回調(diào)函數(shù)*/
      subscribeTokenRefresh((token) => {
       config.headers.Authorization = 'Bearer ' + token
       /*將請求掛起*/
       resolve(config)
      })
     })
     return retry
    }
   }
   return config

  } else {
   /*未登錄直接返回配置信息*/
   return config
  }
 },
 /*錯誤操作*/
 err => {
  return Promise.reject(err)
 }
)

這里需要注意幾點:

1、當token即將過期或者已過期時,原則上,我們只需要有一個接口去觸發(fā)刷新token的請求即可,這里的isRefreshing 變量,就起到這樣一個監(jiān)控的作用,它相當于一把鎖,當刷新token的操作被觸發(fā)后,其他的觸發(fā)操作就被排斥在外了。

window.isRefreshing = false

2、刷新token的接口,用到了一個另外的token(refresh_token),這也是出于安全性考慮的,并且它也有過期時間,不過這個過期時間一般都比普通token的過期時間要長,所以在上面代碼中,會發(fā)現(xiàn),我在請求攔截中優(yōu)先判斷了refresh_token是否過期,如果過期則直接退出登錄,不再進行下一步的操作。

 /*判斷刷新token請求的refresh_token是否過期*/
if (util.isRefreshTokenExpired() && config.url.indexOf('admin/auth/current') === -1) {
 alert('刷新token過期,請重新登錄')
 /*清除本地保存的auth*/
 localStorage.removeItem('auth')
 window.location.href = '#/login'
 return
}

3、在觸發(fā)了刷新token的操作后,我們還需要先將其他的請求掛起,在獲取新的token之后再重新發(fā)起這些請求。

/*把請求(token)=>{....}都push到一個數(shù)組中*/
let retry = new Promise((resolve, reject) => {
 /*(token) => {...}這個函數(shù)就是回調(diào)函數(shù)*/
 subscribeTokenRefresh((token) => {
  config.headers.Authorization = 'Bearer ' + token
  /*將請求掛起*/
  resolve(config)
 })
})
return retry

在刷新token請求的成功回調(diào)里執(zhí)行下面代碼,重新發(fā)起請求。

 /*執(zhí)行數(shù)組里的函數(shù),重新發(fā)起被掛起的請求*/
 onRrefreshed(res.data.data.token)

4、因為有人在評論里問util文件,應(yīng)該是想知道具體怎么判斷token過期的,其實在獲得token時,是有返回一個token過期時間 ,你可以先將它先保存起來,然后在需要時,拿出來與本地時間比較即可

/*判斷token是否過期*/
function isTokenExpired() {
 /*從localStorage中取出token過期時間*/
 let expiredTime = new Date(JSON.parse(localStorage.auth).expired_at).getTime() / 1000
 /*獲取本地時間*/
 let nowTime = new Date().getTime() / 1000
 /*獲取校驗時間差*/
 let diffTime = JSON.parse(sessionStorage.diffTime)
 /*校驗本地時間*/
 nowTime -= diffTime
 /*如果 < 10分鐘,則說明即將過期*/
 return (expiredTime - nowTime) < 10*60
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue.js實現(xiàn)表格合并示例代碼

    vue.js實現(xiàn)表格合并示例代碼

    最近工作中遇到一個需求,是要做一個頁面放張大表格用來顯示數(shù)據(jù)項,純粹為了view層操作方便,就用了vue做渲染。然而又被提出了一個需求,需要相鄰的相同值的行數(shù)據(jù)項進行單元格合并,這就醉了。沒辦法,只能想辦法解決,下面通過這篇文章來一起看看吧。
    2016-11-11
  • 淺析Proxy可以優(yōu)化vue的數(shù)據(jù)監(jiān)聽機制問題及實現(xiàn)思路

    淺析Proxy可以優(yōu)化vue的數(shù)據(jù)監(jiān)聽機制問題及實現(xiàn)思路

    這篇文章主要介紹了淺析Proxy可以優(yōu)化vue的數(shù)據(jù)監(jiān)聽機制問題及實現(xiàn)思路,需要的朋友可以參考下
    2018-11-11
  • 寫一個移動端慣性滑動&回彈Vue導航欄組件 ly-tab

    寫一個移動端慣性滑動&回彈Vue導航欄組件 ly-tab

    前一段時間小編寫一個移動端慣性滑動&回彈Vue導航欄組件 ly-tab,覺的非常實用,大家可能在做項目時會用到,感興趣的朋友跟隨腳本之家小編一起學習吧
    2018-03-03
  • vue異步更新dom的實現(xiàn)淺析

    vue異步更新dom的實現(xiàn)淺析

    Vue中的數(shù)據(jù)更新是異步的,意味著我們在修改完Data之后并不能立刻獲取修改后的DOM元素。本文介紹了vue異步更新dom的實現(xiàn),感興趣的小伙伴們可以參考一下
    2021-07-07
  • vue中關(guān)于template報錯等問題的解決

    vue中關(guān)于template報錯等問題的解決

    這篇文章主要介紹了vue中關(guān)于template報錯等問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue中beforeRouteLeave實現(xiàn)頁面回退不刷新的示例代碼

    vue中beforeRouteLeave實現(xiàn)頁面回退不刷新的示例代碼

    這篇文章主要介紹了vue中beforeRouteLeave實現(xiàn)頁面回退不刷新的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • vue+animation實現(xiàn)翻頁動畫

    vue+animation實現(xiàn)翻頁動畫

    這篇文章主要為大家詳細介紹了vue+animation實現(xiàn)翻頁動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 關(guān)于vue?src路徑動態(tài)拼接的小知識

    關(guān)于vue?src路徑動態(tài)拼接的小知識

    這篇文章主要介紹了vue?src路徑動態(tài)拼接的小知識,具有很好的參考價值,希望對大家有所幫助。
    2022-04-04
  • vue學習筆記之過濾器的基本使用方法實例分析

    vue學習筆記之過濾器的基本使用方法實例分析

    這篇文章主要介紹了vue學習筆記之過濾器的基本使用方法,結(jié)合實例形式分析了vue.js過濾器的基本功能、用法與操作注意事項,需要的朋友可以參考下
    2020-02-02
  • vuex 使用文檔小結(jié)篇

    vuex 使用文檔小結(jié)篇

    Vuex 是一個專為Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式,集中式存儲管理應(yīng)用的所有組件狀態(tài)。本文給大家介紹了vuex使用文檔,需要的朋友參考下吧
    2018-01-01

最新評論