亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

vue的token刷新處理的方法

2019-11-19 13:28:33
字體:
來源:轉載
供稿:網友

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

token身份驗證機制

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

token優點

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

vue的token刷新處理

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

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

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

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

/*是否有請求正在刷新token*/window.isRefreshing = false/*被掛起的請求數組*/let refreshSubscribers = []/*獲取刷新token請求的token*/function getRefreshToken () { return JSON.parse(localStorage.auth).refresh_token}/*push所有請求到數組中*/function subscribeTokenRefresh (cb) { refreshSubscribers.push(cb)}/*刷新請求(refreshSubscribers數組中的請求得到新的token之后會自執行,用新的token去請求數據)*/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      /*發起刷新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))       /*執行數組里的函數,重新發起被掛起的請求*/       onRrefreshed(res.data.data.token)       /*執行onRefreshed函數后清空數組中保存的請求*/       refreshSubscribers = []      }).catch(err => {       alert(err.response.data.message)       /*清除本地保存的auth*/       // localStorage.removeItem('auth')       window.location.href = '#/login'      })     }     /*把請求(token)=>{....}都push到一個數組中*/     let retry = new Promise((resolve, reject) => {      /*(token) => {...}這個函數就是回調函數*/      subscribeTokenRefresh((token) => {       config.headers.Authorization = 'Bearer ' + token       /*將請求掛起*/       resolve(config)      })     })     return retry    }   }   return config  } else {   /*未登錄直接返回配置信息*/   return config  } }, /*錯誤操作*/ err => {  return Promise.reject(err) })

這里需要注意幾點:

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

window.isRefreshing = false

2、刷新token的接口,用到了一個另外的token(refresh_token),這也是出于安全性考慮的,并且它也有過期時間,不過這個過期時間一般都比普通token的過期時間要長,所以在上面代碼中,會發現,我在請求攔截中優先判斷了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、在觸發了刷新token的操作后,我們還需要先將其他的請求掛起,在獲取新的token之后再重新發起這些請求。

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

在刷新token請求的成功回調里執行下面代碼,重新發起請求。

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

4、因為有人在評論里問util文件,應該是想知道具體怎么判斷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}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美怡红院视频一区二区三区| 久久久久久香蕉网| 久久久久久欧美| 国产欧美亚洲视频| 91精品国产一区| 国产欧美欧洲在线观看| 亚洲精品狠狠操| 亚洲精品一区中文字幕乱码| 欧美在线性爱视频| 国产在线精品自拍| 亚洲天堂视频在线观看| 欧美精品videos另类日本| 国产精品福利在线观看| 91久久精品美女| 国产精品久久久久免费a∨大胸| 国产一区二区免费| 中文字幕无线精品亚洲乱码一区| 亚洲一区二区三区在线免费观看| 国产99久久精品一区二区永久免费| 国产精品专区h在线观看| 久久黄色av网站| 午夜精品久久久久久久白皮肤| 亚洲影视中文字幕| 日韩免费高清在线观看| 2019中文字幕在线观看| 日韩电影中文字幕一区| 热99精品只有里视频精品| 伊是香蕉大人久久| 亚洲欧美制服综合另类| 亚洲美女免费精品视频在线观看| 亚洲成人av中文字幕| 国产精品久久久久久久久久久久久久| 在线观看欧美日韩国产| 久久夜色精品亚洲噜噜国产mv| 国产精品网站大全| 色樱桃影院亚洲精品影院| 国产欧洲精品视频| 久久久亚洲精选| 91av成人在线| 日韩美女福利视频| 国产精品亚洲综合天堂夜夜| 最近2019年日本中文免费字幕| 狠狠躁夜夜躁久久躁别揉| 亚洲美女精品久久| 国产精品96久久久久久| 在线观看国产精品日韩av| 精品视频在线导航| 国产精品电影网| 一区二区三区在线播放欧美| 久久韩国免费视频| 欧美日韩福利电影| 欧美人在线观看| 亚洲欧美一区二区精品久久久| 日韩美女写真福利在线观看| 91在线高清视频| 日韩在线精品一区| 亚洲free性xxxx护士白浆| 欧美成人精品xxx| 国内外成人免费激情在线视频网站| 一区二区中文字幕| 欧美黑人视频一区| 8050国产精品久久久久久| 亚洲国产精品va在线看黑人动漫| 国产一区二区黑人欧美xxxx| 欧美精品情趣视频| 欧美一级高清免费| 久久久久久久国产精品| 欧美高清视频在线观看| 日韩av成人在线观看| 欧美放荡办公室videos4k| 日韩av电影手机在线观看| 久久99国产精品自在自在app| 欧美精品久久久久久久免费观看| 欧美乱人伦中文字幕在线| 97福利一区二区| 国产精品免费小视频| 日韩中文字幕在线看| 成人精品久久一区二区三区| 中文字幕久久久av一区| 欧美精品国产精品日韩精品| 国产精品2018| 精品爽片免费看久久| 成人黄色大片在线免费观看| 日本免费在线精品| 欧美成人免费在线观看| 欧美疯狂性受xxxxx另类| 国产精品久久久久久久久免费| 日本精品久久久久久久| 国内自拍欧美激情| 在线丨暗呦小u女国产精品| 亚洲女人被黑人巨大进入| 亚洲欧洲在线视频| 久久久久久免费精品| 51精品在线观看| 久久久久久中文字幕| 欧美日韩国产一区中文午夜| 亚洲成人黄色在线| 黄色一区二区在线| 亚洲国产私拍精品国模在线观看| 日韩在线观看成人| 亚洲美女精品成人在线视频| 在线免费观看羞羞视频一区二区| 欧美亚洲第一区| 91福利视频在线观看| 91在线视频一区| 91视频88av| 黄色一区二区在线| 少妇激情综合网| 国产精品91免费在线| 插插插亚洲综合网| 在线看欧美日韩| 国产精品一区=区| 啪一啪鲁一鲁2019在线视频| 91国偷自产一区二区三区的观看方式| 亚洲午夜性刺激影院| 欧美日韩在线一区| 国产精品入口日韩视频大尺度| 国产精品丝袜高跟| 国产午夜精品全部视频在线播放| 高清欧美性猛交xxxx黑人猛交| 色av吧综合网| 九九精品在线视频| 亚洲综合成人婷婷小说| 亚洲图片欧洲图片av| 欧美一级黑人aaaaaaa做受| 国产精品h片在线播放| 国产精品中文字幕在线观看| 久久久国产在线视频| 国产精品69久久| 国产一区二区三区四区福利| 一区二区亚洲欧洲国产日韩| 日韩亚洲第一页| 91人人爽人人爽人人精88v| 97视频com| 日韩一区二区福利| 久久夜色精品亚洲噜噜国产mv| 国外成人在线播放| 久久亚洲精品毛片| 亚洲美女免费精品视频在线观看| 久久久精品2019中文字幕神马| 国产精品电影久久久久电影网| 国产精品久久久久91| 久久久精品影院| 日韩欧美黄色动漫| 国产精品久久久久av免费| 亚洲日本中文字幕| 国产精品久久久久9999| 日韩电影大片中文字幕| 中文字幕在线观看日韩| 国产精品日韩在线一区| 精品亚洲永久免费精品| 自拍偷拍亚洲区| 日韩免费av一区二区| 欧美精品生活片| 成人写真福利网| 在线精品视频视频中文字幕| 97热精品视频官网| 91精品国产高清自在线| 欧美成人四级hd版| 欧美日韩国产一区二区三区| 国产精品主播视频| 韩国精品久久久999| 中文字幕日韩av电影| 日韩中文字幕在线播放|