Vue攔截器原理以及詳細使用方法
攔截器原理和作用
首先攔截器在src/utils/request.js 文件中,攔截器分為請求攔截器和響應(yīng)攔截器。
頁面中的每一個請求都會經(jīng)過請求攔截和響應(yīng)攔截,所以一般在這個文件進行操作。
這一文件一般引入axios,vuex,Message,router 和相關(guān)方法 ,基地址+攔截器。
請求攔截器:Token的主動處理 給每一個請求添加請求頭token 對請求異常拋出。
響應(yīng)攔截器:簡化axios默認加了一層的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
下面是實際開發(fā)中使用
注意:
當(dāng)我們使用axios時候,他會給我們默認加一層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默認加了一層data // 這個res包括這個請求響應(yīng)回來的所有信息 // 所有的接口請求都會回到這里 // 獲取到本次請求得到的數(shù)據(jù) const data = res.data // 會幫所有的請求打印 // console.log(data); // 判斷本次請求是否成功 if (data.code === 200 || data.code == 0) { // 如果響應(yīng)成功,則正常給他返回數(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 攔截器原理和詳細使用 有了初步的深刻印象,但在實際開發(fā)中我 們遇到的情況肯定是不一樣的,所以我們要理解它的原理,萬變不離其宗。
到此這篇關(guān)于Vue攔截器原理以及詳細使用方法的文章就介紹到這了,更多相關(guān)Vue攔截器原理使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
手把手搭建安裝基于windows的Vue.js運行環(huán)境
手把手教大家搭建安裝基于windows的Vue.js的運行環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06vue實現(xiàn)頂部導(dǎo)航欄以及跳轉(zhuǎn)
這篇文章主要介紹了vue實現(xiàn)頂部導(dǎo)航欄以及跳轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09Vue組件傳值方式(props屬性,父到子,子到父,兄弟傳值)
這篇文章主要介紹了Vue組件傳值方式(props屬性,父到子,子到父,兄弟傳值),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06element select實現(xiàn)組件虛擬滾動優(yōu)化
本文主要介紹了element select實現(xiàn)組件虛擬滾動優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04vue使用動態(tài)組件實現(xiàn)TAB切換效果完整實例
在實際項目開發(fā)中,我們經(jīng)常會遇到選項卡切換,對于一個前端工程師來說,組件化/模塊化開發(fā)是一種必備的行為規(guī)范,下面這篇文章主要給大家介紹了關(guān)于vue使用動態(tài)組件實現(xiàn)TAB切換效果的相關(guān)資料,需要的朋友可以參考下2023-05-05vue-router如何實現(xiàn)history模式配置
這篇文章主要介紹了vue-router如何實現(xiàn)history模式配置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06