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

請(qǐng)求時(shí)token過(guò)期自動(dòng)刷新token操作

 更新時(shí)間:2020年09月11日 15:24:44   作者:江湖小浪蝦  
這篇文章主要介紹了請(qǐng)求時(shí)token過(guò)期自動(dòng)刷新token操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

1.在開(kāi)發(fā)過(guò)程中,我們都會(huì)接觸到token,token的作用是什么呢?主要的作用就是為了安全,用戶登陸時(shí),服務(wù)器會(huì)隨機(jī)生成一個(gè)有時(shí)效性的token,用戶的每一次請(qǐng)求都需要攜帶上token,證明其請(qǐng)求的合法性,服務(wù)器會(huì)驗(yàn)證token,只有通過(guò)驗(yàn)證才會(huì)返回請(qǐng)求結(jié)果。

2.當(dāng)token失效時(shí),現(xiàn)在的網(wǎng)站一般會(huì)做兩種處理,一種是跳轉(zhuǎn)到登陸頁(yè)面讓用戶重新登陸獲取新的token,另外一種就是當(dāng)檢測(cè)到請(qǐng)求失效時(shí),網(wǎng)站自動(dòng)去請(qǐng)求新的token,第二種方式在app保持登陸狀態(tài)上面用得比較多。

3.下面進(jìn)入主題,我們請(qǐng)求用的是axios,不管用何種請(qǐng)求方式,刷新token的原理都是一樣的。

//封裝了一個(gè)統(tǒng)一的請(qǐng)求函數(shù),這個(gè)不是重點(diǎn)

export default function request(url, options) {
  const token = localStorage.getItem('token');
  const defaultOptions = {
    headers: {
      Authorization: `Bearer ${token}`,
    },
    withCredentials: true,
    url: url,
    baseURL: BASE_URL,
  };
  const newOptions = { ...options, ...defaultOptions };
  return axios.request(newOptions)
    .then(checkStatus)
    .catch(error => console.log(error));
}

// 封裝了一個(gè)檢測(cè)返回結(jié)果的函數(shù),與后臺(tái)返回狀態(tài)碼code === 1002表示token失效

let isRefreshing = true;
function checkStatus(response) {
 if (response && response.code === 1002) {
  // 刷新token的函數(shù),這需要添加一個(gè)開(kāi)關(guān),防止重復(fù)請(qǐng)求
  if(isRefreshing){
    refreshTokenRequst()
  }
  isRefreshing = false;
  // 這個(gè)Promise函數(shù)很關(guān)鍵
   const retryOriginalRequest = new Promise((resolve) => {
        addSubscriber(()=> {
          resolve(request(url, options))
        })
      });
      return retryOriginalRequest;
 }else{
   return response;
 }
}

// 刷新token的請(qǐng)求函數(shù)

function refreshTokenRequst(){
  let data;
  const refreshToken = localStorage.getItem('refreshToken');
  data:{
    authorization: 'YXBwYXBpczpaSWxhQUVJdsferTeweERmR1praHk=',
    refreshToken,
  }
  axios.request({
    baseURL: BASE_URL,
    url:'/app/renewal',
    method: 'POST',
    data,
  }).then((response)=>{
    localStorage.setItem('refreshToken',response.data.refreshToken);
    localStorage.setItem('token',response.data.token);
    onAccessTokenFetched();
    isRefreshing = true;
  });
}

// Promise函數(shù)集合

let subscribers = [];
function onAccessTokenFetched() {
  subscribers.forEach((callback)=>{
    callback();
  })
  subscribers = [];
}

function addSubscriber(callback) {
  subscribers.push(callback)
}

總結(jié):

其實(shí)token失效,自動(dòng)刷新token,在頁(yè)面只有一個(gè)請(qǐng)求的時(shí)候是比較好處理的,但是如果頁(yè)面同時(shí)有多個(gè)請(qǐng)求,并且都會(huì)產(chǎn)生token失效,這就需要一些稍微復(fù)雜的處理,解決方式主要是用了Promise 函數(shù)來(lái)進(jìn)行處理。

每一個(gè)token失效的請(qǐng)求都會(huì)存到一個(gè)Promise函數(shù)集合里面,當(dāng)刷新token的函數(shù)執(zhí)行完畢后,才會(huì)批量執(zhí)行這些Promise函數(shù),返回請(qǐng)求結(jié)果。

還有一點(diǎn)要注意一下,這兒設(shè)置一個(gè)刷新token的開(kāi)關(guān)isRefreshing,這個(gè)是非常有必要的,防止重復(fù)請(qǐng)求。

以上這篇請(qǐng)求時(shí)token過(guò)期自動(dòng)刷新token操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 再談javascript圖片預(yù)加載技術(shù)(詳細(xì)演示)

    再談javascript圖片預(yù)加載技術(shù)(詳細(xì)演示)

    由于javascript無(wú)法獲取img文件頭數(shù)據(jù),必須等待其加載完畢后才能獲取真實(shí)的大小,所以lightbox類效果為了讓圖片居中顯示,導(dǎo)致其速度體驗(yàn)要比直接輸出的差很多。
    2011-03-03
  • 詳解用async/await來(lái)處理異步

    詳解用async/await來(lái)處理異步

    這篇文章主要介紹了詳解用async/await來(lái)處理異步,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • JavaScript中的閉包介紹

    JavaScript中的閉包介紹

    這篇文章主要介紹了JavaScript中的閉包介紹,本文講解了Javacript 閉包、Javscript 閉包與this、Javscript 閉包與讀寫(xiě)變量等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • JS實(shí)現(xiàn)touch 點(diǎn)擊滑動(dòng)輪播實(shí)例代碼

    JS實(shí)現(xiàn)touch 點(diǎn)擊滑動(dòng)輪播實(shí)例代碼

    這篇文章主要介紹了JS實(shí)現(xiàn)touch 點(diǎn)擊滑動(dòng)輪播實(shí)例代碼,需要的朋友可以參考下
    2017-01-01
  • 淺談JS三座大山之異步和單線程

    淺談JS三座大山之異步和單線程

    首先我們要知道,js這門(mén)語(yǔ)言是單線程的,同時(shí)只能做一件事,比如說(shuō)渲染dom,執(zhí)行js方法,這些事情只能一個(gè)一個(gè)做,不能分開(kāi)執(zhí)行。(因?yàn)閖s需要操作dom,當(dāng)兩個(gè)js方法同時(shí)操作一個(gè)dom的時(shí)候就會(huì)出問(wèn)題,所以js被設(shè)計(jì)成了單線程)。本文將介紹JS三座大山之異步和單線程。
    2021-06-06
  • 基于JS實(shí)現(xiàn)仿京東搜索欄隨滑動(dòng)透明度漸變效果

    基于JS實(shí)現(xiàn)仿京東搜索欄隨滑動(dòng)透明度漸變效果

    這篇文章主要介紹了基于JS實(shí)現(xiàn)仿京東搜索欄隨滑動(dòng)透明度漸變效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-07-07
  • CSS javascript 結(jié)合實(shí)現(xiàn)懸浮固定菜單效果

    CSS javascript 結(jié)合實(shí)現(xiàn)懸浮固定菜單效果

    本篇文章給大家介紹基于CSS javascript 結(jié)合實(shí)現(xiàn)懸浮固定菜單效果,附有源碼下載,需要的朋友可以參考下
    2015-08-08
  • JS文件上傳神器bootstrap fileinput詳解

    JS文件上傳神器bootstrap fileinput詳解

    這篇文章主要介紹了JS文件上傳神器Bootstrap FileInput,樣式非常美觀,并且支持上傳文件預(yù)覽,ajax同步或異步上傳,拖曳文件上傳等炫酷的功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • JavaScript實(shí)現(xiàn)時(shí)鐘滴答聲效果

    JavaScript實(shí)現(xiàn)時(shí)鐘滴答聲效果

    本文給大家分享一段js實(shí)例代碼實(shí)現(xiàn)時(shí)鐘滴答聲效果,效果逼真,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-01-01
  • 在js文件中如何獲取basePath處理js路徑問(wèn)題

    在js文件中如何獲取basePath處理js路徑問(wèn)題

    在jsp中,我們可以用el表達(dá)式直接獲取basePath,但是在單獨(dú)js文件中不能用el表達(dá)式,下面與大家分享下js文件中如何獲取basePath,感興趣的朋友可以參考下
    2013-07-07

最新評(píng)論