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

Vue?Token過(guò)期問(wèn)題的2種解決方案小結(jié)

 更新時(shí)間:2023年02月18日 10:57:51   作者:Ethereal霄  
在使用token進(jìn)行登錄的過(guò)程中,如果token過(guò)期了,需要重新輸入用戶名和密碼登錄,這種體驗(yàn)肯定是不好的,下面這篇文章主要給大家介紹了關(guān)于Vue?Token過(guò)期問(wèn)題的2種解決方案,需要的朋友可以參考下

對(duì)于token過(guò)期,我們有兩種方案:

方案一:當(dāng)我們操作某個(gè)需要token作為請(qǐng)求頭的接口時(shí),返回的數(shù)據(jù)錯(cuò)誤error.response.status === 401,說(shuō)明我們的token已經(jīng)過(guò)期了。

我們希望當(dāng)響應(yīng)返回的數(shù)據(jù)是401身份過(guò)期時(shí),讓當(dāng)前瀏覽頁(yè)面強(qiáng)行跳轉(zhuǎn)到登入頁(yè)面,讓用戶手動(dòng)更新token。拿到最新的token值后再跳回之前瀏覽的頁(yè)面。增強(qiáng)用戶體驗(yàn)。

實(shí)現(xiàn)原理:

阻攔響應(yīng)器中配置:

// 阻攔響應(yīng)器
request.interceptors.response.use(function (response) {
  return response
}, async function (error) {
  if (error.response && error.response.status === 401) {
    // token續(xù)簽方式1:
    //清空當(dāng)前vuex保存的token(我們這的vuex和本地已經(jīng)建立了關(guān)系,相當(dāng)于也清空了本地token)
     store.commit('upUser', '')
     console.log(router.currentRoute.fullPath)// 當(dāng)前路由的完整路徑(#后面的)
      //這里我們采用?path=的方式保存當(dāng)前瀏覽頁(yè)面的完整路徑,
    // push()會(huì)產(chǎn)生歷史記錄 而replace不會(huì)有歷史記錄
     router.push({ path: `/login?path=${router.currentRoute.fullPath}` })
 
  }
  return Promise.reject(error)
})

再登入組件中給登入功能函數(shù)添加:

 this.$router.replace({
          path: this.$route.query.path || '/'
        })

// 1.點(diǎn)擊登入
    async onSubmit () {
      try {
        const { data: res } = await loginAPI(this.user)
        //登錄成功
        // 不嚴(yán)謹(jǐn)?shù)姆祷厣洗螢g覽的頁(yè)面
        // this.$router.back()
        // 推薦方式:
        // 登錄后, 判斷有未遂地址(有未遂地址的情況是:token過(guò)期,在阻攔響應(yīng)器中實(shí)現(xiàn)對(duì)未遂地址的保存), 登入成功后跳轉(zhuǎn)到未遂地址, 否則去/路徑(跳到首頁(yè)--這種情況是:用戶主動(dòng)前往登入頁(yè)面的登入,沒(méi)有未遂地址,登入成功后直接前往首頁(yè))
        // replace不會(huì)產(chǎn)生路由歷史記錄
        this.$router.replace({
          path: this.$route.query.path || '/'
        })
        // 存儲(chǔ)獲取過(guò)來(lái)的token
        this.$store.commit('upUser', res.data)
      } catch (err) {
        console.log(err)
        if (err.response.status === 400) {
          this.$toast.fail('手機(jī)號(hào)或驗(yàn)證碼錯(cuò)誤')
        } else {
          this.$toast.fail('登入失敗,請(qǐng)稍后再試') // 可能由于網(wǎng)絡(luò)問(wèn)題導(dǎo)致的登入失敗
        }
      }
    },

方案二:實(shí)現(xiàn)用戶無(wú)感知的刷新token值,我們希望當(dāng)響應(yīng)返回的數(shù)據(jù)是401身份過(guò)期時(shí),響應(yīng)阻攔器自動(dòng)幫我們刷新token值,而不是讓用戶手動(dòng)更新token。拿到最新的token值后再重新發(fā)起剛剛因token過(guò)期的請(qǐng)求。從而實(shí)現(xiàn)無(wú)感知

前提是有后臺(tái)的配合:

登入后后臺(tái)接口返回值要求:必須提供刷新token的令牌

并且后臺(tái)提供了刷新token的接口: (請(qǐng)求頭要求是refresh_token)

注意:1. 在請(qǐng)求響應(yīng)器中做判斷在非刷新token的時(shí)候,給請(qǐng)求頭配置token,而刷新token的時(shí)候,我們自己手動(dòng)添加請(qǐng)求頭為refresh_token

2.refresh_token也有過(guò)期的時(shí)候,這時(shí)只能強(qiáng)行讓用戶自己重新登入了

// 刷新用戶token
export const updataTokenAPI = function () {
  return request({
    method: 'PUT',
    url: '/v1_0/authorizations',
    headers: {
      Authorization: `Bearer ${store.state.user.refresh_token}`
    }
  })
}

實(shí)現(xiàn)原理: 

import request from '@/utils/request'
import store from '@/store'
 
// 請(qǐng)求響應(yīng)器
request.interceptors.request.use(function (config) {
  // config :本次請(qǐng)求的配置對(duì)象
  // config 里面有一個(gè)屬性:headers
  const { user } = store.state
//請(qǐng)求頭未配置信息的時(shí)候才會(huì)配置
  if (user.token && config.headers.Authorizatio === undefined) {
    config.headers.Authorization = `Bearer ${user.token}`
  }
  // 這里必須將config返回出去,否則請(qǐng)求會(huì)停在這 里
  return config
}, function (error) {
  // 如果請(qǐng)求出錯(cuò)(還沒(méi)發(fā)送出去,可能是代碼寫錯(cuò)了的問(wèn)題),就會(huì)進(jìn)入這里
  return Promise.reject(error)
})
 
// 阻攔響應(yīng)器
request.interceptors.response.use(function (response) {
  return response
}, async function (error) {
  if (error.response && error.response.status === 401) {
    // token續(xù)簽方式2: refreshToken(用戶無(wú)感知)
    // 將過(guò)期的token值清空
    store.commit('updataToken', '')
    //請(qǐng)求刷新token接口
    const { data: res } = await updataTokenAPI()
    //保存新的token值
    store.commit('updataToken', res.data.token)
    // 再調(diào)用一次未完成的請(qǐng)求啊(用戶無(wú)感知)
    // error.config 就是上一次axios請(qǐng)求的配置對(duì)象
    // console.dir(error.config)
    // 把新的token賦予到下一次axios請(qǐng)求的請(qǐng)求頭中
    error.config.headers.Authorization = 'Bearer ' + res.data.token
    // return到await的地方,將未完成的請(qǐng)求再次發(fā)起,
    return axios(error.config)
  } else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations') {
    // 因?yàn)?00的情況有很多種,refresh_token失效也是其中一種情況,所有再加上error.config.url === '/v1_0/authorizations'條件,確保是refresh_token失效情況
    // 清空所有的token和refresh_toekn,并且強(qiáng)制跳轉(zhuǎn)登錄頁(yè)面
    store.commit('upUser', {})
    router.push({ path: '/login' })
    Toast.fail('身份已過(guò)期')
  }
  return Promise.reject(error)
})

總結(jié)

到此這篇關(guān)于Vue Token過(guò)期問(wèn)題的2種解決方案的文章就介紹到這了,更多相關(guān)Vue Token過(guò)期問(wèn)題解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue中watch和computed的區(qū)別詳解

    vue中watch和computed的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于vue中watch和computed區(qū)別的相關(guān)資料,computed和watch都是vue框架中的用于監(jiān)聽數(shù)據(jù)變化的屬性,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 一文帶你了解Vue數(shù)組的變異方法

    一文帶你了解Vue數(shù)組的變異方法

    Vue框架提供了一些便捷的數(shù)組變異方法,包括push、pop、shift、unshift、splice、sort和reverse等,Vue的數(shù)組變異方法可以自動(dòng)觸發(fā)DOM更新,本文就詳細(xì)帶大家了解一下Vue.js數(shù)組的變異方法
    2023-06-06
  • vueCli?4.x升級(jí)5.x報(bào)錯(cuò):Progress?Plugin?Invalid?Options的解決方法

    vueCli?4.x升級(jí)5.x報(bào)錯(cuò):Progress?Plugin?Invalid?Options的解決方法

    本文主要介紹了vueCli?4.x升級(jí)5.x報(bào)錯(cuò):Progress?Plugin?Invalid?Options的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • 解決vue中無(wú)法動(dòng)態(tài)修改jqgrid組件 url地址的問(wèn)題

    解決vue中無(wú)法動(dòng)態(tài)修改jqgrid組件 url地址的問(wèn)題

    下面小編就為大家分享一篇解決vue中無(wú)法動(dòng)態(tài)修改jqgrid組件 url地址的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • vue2中基于vue-simple-upload實(shí)現(xiàn)文件分片上傳組件功能

    vue2中基于vue-simple-upload實(shí)現(xiàn)文件分片上傳組件功能

    這篇文章主要介紹了vue2中基于vue-simple-upload的文件分片上傳組件,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • vue?echart的使用詳細(xì)教程

    vue?echart的使用詳細(xì)教程

    這篇文章主要為大家詳細(xì)介紹了Vue中引用echarts的超詳細(xì)教程,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們熟練使用vue有一定的幫助,需要的小伙伴可以參考一下
    2023-09-09
  • vue移動(dòng)端監(jiān)聽滾動(dòng)條高度的實(shí)現(xiàn)方法

    vue移動(dòng)端監(jiān)聽滾動(dòng)條高度的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇vue移動(dòng)端監(jiān)聽滾動(dòng)條高度的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Vue3中其他的Composition?API詳解

    Vue3中其他的Composition?API詳解

    這篇文章主要介紹了Vue3中其他的Composition?API,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • JavaScript 沙箱探索

    JavaScript 沙箱探索

    這篇文章主要介紹了JavaScript 沙箱探索,沙箱是基于 event bus 形式的通信實(shí)現(xiàn)上層的功能,文章的例子選擇接口實(shí)現(xiàn)了 web worker 與 quickjs 的 EventEmitter,,需要的朋友可以參考一下
    2021-10-10
  • 詳解vue之mixin的使用

    詳解vue之mixin的使用

    這篇文章主要為大家介紹了vue之mixin的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11

最新評(píng)論

花莲市| 贞丰县| 开鲁县| 恩施市| 宁津县| 汕头市| 偃师市| 固安县| 岳池县| 中江县| 木兰县| 鸡东县| 乐都县| 岳阳市| 轮台县| 葫芦岛市| 南澳县| 汝州市| 偃师市| 延津县| 怀安县| 民勤县| 汽车| 芜湖县| 武清区| 鞍山市| 锡林郭勒盟| 嵊泗县| 马山县| 云浮市| 交城县| 富阳市| 鄂托克前旗| 石渠县| 大同县| 娄底市| 宜兰县| 延川县| 岑溪市| 宜良县| 海阳市|