axios攔截函數(shù)封裝

一篷扩、路由攔截

const routes = [
    {
        path: '/',
        name: '/',
        component: Index
    },
    {
        path: '/repository',
        name: 'repository',
        meta: {
            requireAuth: true,  // 添加該字段,表示進(jìn)入這個(gè)路由是需要登錄的
        },
        component: Repository
    },
    {
        path: '/login',
        name: 'login',
        component: Login
    }
];
router.beforeEach((to, from, next) => {
    if (to.meta.requireAuth) {  // 判斷該路由是否需要登錄權(quán)限
        if (store.state.token) {  // 通過vuex state獲取當(dāng)前的token是否存在
            next();
        }
        else {
            next({
                path: '/login',
                query: {redirect: to.fullPath}  // 將跳轉(zhuǎn)的路由path作為參數(shù)茉盏,登錄成功后跳轉(zhuǎn)到該路由
            })
        }
    }
    else {
        next();
    }
})

每個(gè)鉤子方法接收三個(gè)參數(shù):

  • to: Route: 即將要進(jìn)入的目標(biāo) 路由對(duì)象
  • from: Route: 當(dāng)前導(dǎo)航正要離開的路由
  • next: Function: 一定要調(diào)用該方法來 resolve 這個(gè)鉤子鉴未。執(zhí)行效果依賴 next 方法的調(diào)用參數(shù)。
  • next(): 進(jìn)行管道中的下一個(gè)鉤子鸠姨。如果全部鉤子執(zhí)行完了铜秆,則導(dǎo)航的狀態(tài)就是 confirmed (確認(rèn)的)。
  • next(false): 中斷當(dāng)前的導(dǎo)航讶迁。如果瀏覽器的 URL 改變了(可能是用戶手動(dòng)或者瀏覽器后退按鈕)连茧,那么 URL 地址會(huì)重置到 from 路由對(duì)應(yīng)的地址。
  • next(‘/’) 或者 next({ path: ‘/’ }): 跳轉(zhuǎn)到一個(gè)不同的地址巍糯。當(dāng)前的導(dǎo)航被中斷啸驯,然后進(jìn)行一個(gè)新的導(dǎo)航。

攔截器

axios攔截請(qǐng)求:首次登錄的請(qǐng)求不帶token祟峦,之后都帶上token
axios攔截響應(yīng):請(qǐng)求時(shí)報(bào)錯(cuò)的部分處理封裝函數(shù)

import stores from 'store'
import axios from 'axios'
import { Message } from 'element-ui'
import router from './router'
// 攔截請(qǐng)求
axios.interceptors.request.use(
  config => {
    // POST || PUT || DELETE請(qǐng)求時(shí)先格式化data數(shù)據(jù)
   // 這里需要引入第三方模塊qs
   if (
     config.method.toLocaleUpperCase() === 'post' ||
     config.method.toLocaleUpperCase() === 'put' ||
     config.method.toLocaleUpperCase() === 'delete'
   ) {
     config.data = qs.stringify(config.data)
   }

    if (stores.get('tokenData')) {
      config.headers.Authorization = `Token ${stores.get('tokenData').token}`
    }
    // console.log(config, '響應(yīng)數(shù)據(jù)')
    return config
  },
  err => {
    // console.log(err)
    return Promise.reject(err)
  })

// 攔截響應(yīng)
axios.interceptors.response.use(
  response => {
    // console.log(response, '響應(yīng)正確')
    return response
  },
  error => {
    // 此處報(bào)錯(cuò)可能因素比較多
    // 1.需要授權(quán)處用戶還未登錄罚斗,因?yàn)槁酚啥斡序?yàn)證是否登陸,此處理論上不會(huì)出現(xiàn)
    // 2.需要授權(quán)處用戶登登錄過期
    // 3.請(qǐng)求錯(cuò)誤 4xx
    // 5.服務(wù)器錯(cuò)誤 5xx
    // 關(guān)于鑒權(quán)失敗宅楞,與后端約定狀態(tài)碼為500
    console.log(error.response, '響應(yīng)錯(cuò)誤攔截')
    let text = ''
    if (error.response) {
      text = setResponse(error.response.data)
    } else {
      Message.error({
        message: '響應(yīng)有誤针姿,請(qǐng)聯(lián)系管理員',
        duration: 1000
      })
    }
    switch (error.response.status) {
      case 403:
        // 一些處理...
        break
      case 404:
        // 一些處理...
        break
      case 500:
        let userData = getUserData()
        if (userData.token === undefined) {
          // 此處為未登錄處理
          // 一些處理之后...再去登錄頁面...
          // router.push({
          //   path: '/login'
          // })
        } else {
          let overdueTime = userData.overdueTime
          let nowTime = +new Date
          if (overdueTime && nowTime > overdueTime) {
            // 此處登錄過期的處理
            // 一些處理之后...再去登錄頁面...
            // router.push({
            //   path: '/login'
            // })
          } else {
            // 極端情況,登錄未過期厌衙,但是不知道哪兒錯(cuò)了
            // 按需處理吧...我暴力回到了首頁
            router.push({
              path: '/'
            })
          }
        }
        break
      case 501:
        // 一些處理...
        break
      default:
        // 狀態(tài)碼辣么多距淫,按需配置...
        break
    }
    return error;
    // return Promise.reject(error.response.data)
  })

function setResponse(jsonObj) {
    for (let key in jsonObj) {
        let element = jsonObj[key]
        if (element.length > 0 && typeof (element) === 'object' || typeof (element) === 'object') {
             // console.log(element)
            setResponse(element)
        } else {
            arr.push(element)
        }
    }
    return arr
}

// 注銷
export function removeLogin() {
    stores.remove('tokenData')//移除store里面的緩存
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市迅箩,隨后出現(xiàn)的幾起案子溉愁,更是在濱河造成了極大的恐慌,老刑警劉巖饲趋,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拐揭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奕塑,警方通過查閱死者的電腦和手機(jī)堂污,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來龄砰,“玉大人盟猖,你說我怎么就攤上這事』慌铮” “怎么了式镐?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長固蚤。 經(jīng)常有香客問我娘汞,道長,這世上最難降的妖魔是什么夕玩? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任你弦,我火速辦了婚禮,結(jié)果婚禮上燎孟,老公的妹妹穿的比我還像新娘禽作。我一直安慰自己,他們只是感情好揩页,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布旷偿。 她就那樣靜靜地躺著,像睡著了一般爆侣。 火紅的嫁衣襯著肌膚如雪萍程。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天累提,我揣著相機(jī)與錄音尘喝,去河邊找鬼。 笑死斋陪,一個(gè)胖子當(dāng)著我的面吹牛朽褪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播无虚,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼缔赠,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了友题?” 一聲冷哼從身側(cè)響起嗤堰,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎度宦,沒想到半個(gè)月后踢匣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體告匠,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年离唬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了后专。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡输莺,死狀恐怖戚哎,靈堂內(nèi)的尸體忽然破棺而出嫂用,到底是詐尸還是另有隱情型凳,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布嘱函,位于F島的核電站甘畅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏实夹。R本人自食惡果不足惜橄浓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亮航。 院中可真熱鬧荸实,春花似錦、人聲如沸缴淋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽重抖。三九已至露氮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钟沛,已是汗流浹背畔规。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恨统,地道東北人叁扫。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像畜埋,于是被迫代替她去往敵國和親莫绣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容