Vue攔截器原理以及詳細(xì)使用方法
攔截器原理和作用
首先攔截器在src/utils/request.js 文件中,攔截器分為請(qǐng)求攔截器和響應(yīng)攔截器。
頁(yè)面中的每一個(gè)請(qǐng)求都會(huì)經(jīng)過(guò)請(qǐng)求攔截和響應(yīng)攔截,所以一般在這個(gè)文件進(jìn)行操作。
這一文件一般引入axios,vuex,Message,router 和相關(guān)方法 ,基地址+攔截器。
請(qǐng)求攔截器:Token的主動(dòng)處理 給每一個(gè)請(qǐng)求添加請(qǐng)求頭token 對(duì)請(qǐng)求異常拋出。
響應(yīng)攔截器:簡(jiǎn)化axios默認(rèn)加了一層的data Token被動(dòng)處理 對(duì)請(qǐng)求異常拋出。
最簡(jiǎn)化版本
// 導(dǎo)入axios
import axios from 'axios'
// 基地址
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
// 5秒超時(shí)
timeout: 10000
})
// 請(qǐng)求攔截
request.interceptors.request.use(
config => {
return config
},
error => {
return Promise.reject(error)
}
)
// 響應(yīng)攔截
request.interceptors.response.use(
res => {
return res
},
// 響應(yīng)錯(cuò)誤的代碼寫這里
error => {
return Promise.reject(error)
}
)
// 暴露副本
export default service下面是實(shí)際開發(fā)中使用
注意:
當(dāng)我們使用axios時(shí)候,他會(huì)給我們默認(rèn)加一層data。這樣我們?nèi)?shù)據(jù)的時(shí)候就會(huì)比較增加無(wú)效代碼,所以我們可以在數(shù)據(jù)響應(yīng)的時(shí)候判斷,給他人為的去掉一層,如下面判斷 return data ,這樣就可以直接res.data.變量
還有一個(gè)是token 處理 這里包含了主動(dòng)處理:登錄時(shí)候存一個(gè)時(shí)間,判斷這個(gè)時(shí)間,超過(guò)就調(diào)用登出方法,提示信息,打回到登錄頁(yè)。被動(dòng)處理:異常的時(shí)候判斷一下,如果是和后端規(guī)定好的token過(guò)期狀態(tài)碼(比如401),就調(diào)用登出方法,提示信息,打回到登錄頁(yè)。
基地址最好不要寫死寫變量名,這樣我們就可以通過(guò)改環(huán)境文件快速更改地址。
// 導(dǎo)入axios
import axios from 'axios'
// 導(dǎo)入提示信息
import { Message } from 'element-ui'
// 導(dǎo)入vuex
import store from '@/store'
// 導(dǎo)入路由
import router from '@/router'
// 導(dǎo)入獲取時(shí)間和token的工具函數(shù)
import { getToken, getTokenTime } from '@/utils/auth'
// 基地址
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
// 5秒超時(shí)
timeout: 10000
})
// 請(qǐng)求攔截
// 添加一個(gè)service的請(qǐng)求攔截器
service.interceptors.request.use(
async config => {
// config就是本次發(fā)請(qǐng)求的信息
// 判斷有沒有token
if (store.state.user.token) {
// token失效的主動(dòng)處理
// 獲取一下記錄token的時(shí)間
let start = getTokenTime()
// 獲取一下當(dāng)前時(shí)間
let now = Date.now()
// 算出時(shí)間差
let hour = (now - start) / 1000 / 3600
// 判斷是否超過(guò)1小時(shí)
if (hour >= 1) {
// 代表token過(guò)期
await store.dispatch('user/logout')
Message.error('token已過(guò)期,請(qǐng)重新登錄')
router.push('/login')
// return代表不往下執(zhí)行,所以這個(gè)請(qǐng)求不會(huì)發(fā)送
return
}
config.headers.Authorization = 'Bearer ' + getToken()
config.headers['Bearer'] = getToken()
// config.headers.tenantid = getTenantId ()
}
// 發(fā)送請(qǐng)求
return config
},
error => {
return Promise.reject(error)
}
)
// 響應(yīng)攔截
service.interceptors.response.use(
res => {
// axios默認(rèn)加了一層data
// 這個(gè)res包括這個(gè)請(qǐng)求響應(yīng)回來(lái)的所有信息
// 所有的接口請(qǐng)求都會(huì)回到這里
// 獲取到本次請(qǐng)求得到的數(shù)據(jù)
const data = res.data
// 會(huì)幫所有的請(qǐng)求打印
// console.log(data);
// 判斷本次請(qǐng)求是否成功
if (data.code === 200 || data.code == 0) {
// 如果響應(yīng)成功,則正常給他返回?cái)?shù)據(jù)
return data
} else {
// 證明失敗,我們需要讓外面的catch被調(diào)用
// 要讓catch被調(diào)用,就要手動(dòng)拋出一個(gè)錯(cuò)誤,并把服務(wù)器返回的消息拋回去
Message.warning(data.message || data.msg)
return Promise.reject(data.message)
}
},
async error => {
// token失效的被動(dòng)處理
console.log(error)
if (error.response.data.code === 401) {
await store.dispatch('user/logout')
Message.warning('登錄狀態(tài)過(guò)期,請(qǐng)重新登錄!')
router.push('/login')
} else {
return Promise.reject(error)
}
}
// error => {
// return Promise.reject(error)
// }
)
// 暴露副本
export default service瀏覽器存取

總結(jié):
經(jīng)過(guò)這一趟流程下來(lái)相信你也對(duì) Vue 攔截器原理和詳細(xì)使用 有了初步的深刻印象,但在實(shí)際開發(fā)中我 們遇到的情況肯定是不一樣的,所以我們要理解它的原理,萬(wàn)變不離其宗。
到此這篇關(guān)于Vue攔截器原理以及詳細(xì)使用方法的文章就介紹到這了,更多相關(guān)Vue攔截器原理使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue+GeoScene監(jiān)測(cè)瀏覽器內(nèi)存變化并優(yōu)化性能
在做 Vue 項(xiàng)目集成 GeoScene 地圖的時(shí)候,很多人都會(huì)遇到一個(gè)頭疼問(wèn)題,頁(yè)面切幾次,地圖重建幾次,瀏覽器就卡,內(nèi)存就飆,下面我們就來(lái)看看具體的解決方案吧2025-11-11
vue使用iview的modal彈窗嵌套modal出現(xiàn)格式錯(cuò)誤的解決
這篇文章主要介紹了vue使用iview的modal彈窗嵌套modal出現(xiàn)格式錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Vue中定義src在img標(biāo)簽使用時(shí)加載不出來(lái)的解決
這篇文章主要介紹了Vue中定義src在img標(biāo)簽使用時(shí)加載不出來(lái)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Vue實(shí)現(xiàn)動(dòng)態(tài)路由的示例詳解
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)動(dòng)態(tài)路由的相關(guān)知識(shí),主要涉及到兩個(gè)方面:一是路由的動(dòng)態(tài)添加,二是基于路由的參數(shù)變化來(lái)動(dòng)態(tài)渲染組件,下面就跟隨小編一起深入學(xué)習(xí)一下動(dòng)態(tài)路由的實(shí)現(xiàn)吧2024-02-02
Vue中使用this.$set()如何新增數(shù)據(jù),更新視圖
這篇文章主要介紹了Vue中使用this.$set()實(shí)現(xiàn)新增數(shù)據(jù),更新視圖方式。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Vue使用antd中input組件去驗(yàn)證輸入框輸入內(nèi)容(rules?案例)
這篇文章主要介紹了Vue使用antd中input組件去驗(yàn)證輸入框輸入內(nèi)容-rules-案例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
Vue編譯器中的過(guò)濾器轉(zhuǎn)換機(jī)制(transformFilter)詳解
本文將詳細(xì)解讀?Vue?兼容模式下的過(guò)濾器編譯邏輯——transformFilter?模塊,它是?Vue?3?為了兼容?Vue?2?模板過(guò)濾器語(yǔ)法而存在的編譯階段轉(zhuǎn)換器,需要的朋友可以參考下2025-11-11

