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

總結(jié):
經(jīng)過這一趟流程下來相信你也對 Vue 攔截器原理和詳細(xì)使用 有了初步的深刻印象,但在實(shí)際開發(fā)中我 們遇到的情況肯定是不一樣的,所以我們要理解它的原理,萬變不離其宗。
到此這篇關(guān)于Vue攔截器原理以及詳細(xì)使用方法的文章就介紹到這了,更多相關(guān)Vue攔截器原理使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
手把手搭建安裝基于windows的Vue.js運(yùn)行環(huán)境
手把手教大家搭建安裝基于windows的Vue.js的運(yùn)行環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
vue實(shí)現(xiàn)頂部導(dǎo)航欄以及跳轉(zhuǎn)
這篇文章主要介紹了vue實(shí)現(xiàn)頂部導(dǎo)航欄以及跳轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
vue+epubjs實(shí)現(xiàn)電子書閱讀器的基本功能
這篇文章主要為大家詳細(xì)介紹了如何使用vue+epubjs實(shí)現(xiàn)電子書閱讀器的基本功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
Vue組件傳值方式(props屬性,父到子,子到父,兄弟傳值)
這篇文章主要介紹了Vue組件傳值方式(props屬性,父到子,子到父,兄弟傳值),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
element select實(shí)現(xiàn)組件虛擬滾動優(yōu)化
本文主要介紹了element select實(shí)現(xiàn)組件虛擬滾動優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
vue使用動態(tài)組件實(shí)現(xiàn)TAB切換效果完整實(shí)例
在實(shí)際項(xiàng)目開發(fā)中,我們經(jīng)常會遇到選項(xiàng)卡切換,對于一個前端工程師來說,組件化/模塊化開發(fā)是一種必備的行為規(guī)范,下面這篇文章主要給大家介紹了關(guān)于vue使用動態(tài)組件實(shí)現(xiàn)TAB切換效果的相關(guān)資料,需要的朋友可以參考下2023-05-05
vue-router如何實(shí)現(xiàn)history模式配置
這篇文章主要介紹了vue-router如何實(shí)現(xiàn)history模式配置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06

