用Vue實現(xiàn)頁面訪問攔截的方法詳解
頁面訪問攔截
目標:基于全局前置守衛(wèi),進行頁面訪問攔截處理
說明: 大家在做前端項目的時候,大部分頁面, 游客都可以直接訪問 , 如遇到 需要登錄 才能進行的操作,頁面將提示并跳轉到登錄界面
但是 : 對于 支付頁,訂單頁 等,必須是登錄的用戶才能訪問的,游客不能進入該頁面, 需要做攔截處理
那么如何才能實現(xiàn)頁面攔截并跳轉到對應的登錄界面呢?
1.創(chuàng)建axios實例
// 創(chuàng)建 axios 實例,將來對創(chuàng)建出來的實例,進行自定義配置 // 好處:不會污染原始的 axios 實例 import axios from 'axios' const instance = axios.create({ baseURL: 'https://some-domain.com/api/', timeout: 1000, headers: {'X-Custom-Header': 'foobar'} });
2.添加攔截器
在請求或響應被 then 或 catch 處理前攔截它們。
// 添加請求攔截器 instance.interceptors.request.use(function (config) { // 在發(fā)送請求之前做些什么 return config; }, function (error) { // 對請求錯誤做些什么 return Promise.reject(error); }); // 添加響應攔截器 instance.interceptors.response.use(function (response) { // 2xx 范圍內(nèi)的狀態(tài)碼都會觸發(fā)該函數(shù)。 // 對響應數(shù)據(jù)做點什么 return response; }, function (error) { // 超出 2xx 范圍的狀態(tài)碼都會觸發(fā)該函數(shù)。 // 對響應錯誤做點什么 return Promise.reject(error); });
3.全局前置守衛(wèi)
vue-router 提供的導航守衛(wèi)主要用來通過跳轉或取消的方式守衛(wèi)導航。
訪問權限頁面時,攔截或放行的關鍵點? → 用戶是否有登錄權證 token
你可以使用 router.beforeEach
注冊一個全局前置守衛(wèi):
const router = createRouter({ ... }) router.beforeEach((to, from) => { // ... // 返回 false 以取消導航 return false })
當一個導航觸發(fā)時,全局前置守衛(wèi)按照創(chuàng)建順序調(diào)用。守衛(wèi)是異步解析執(zhí)行,此時導航在所有守衛(wèi) resolve 完之前一直處于等待中。
每個守衛(wèi)方法接收兩個參數(shù):
- to: 即將要進入的目標 用一種標準化的方式
- from: 當前導航正要離開的路由 用一種標準化的方式
可以返回的值如下:
- false: 取消當前的導航。如果瀏覽器的 URL 改變了(可能是用戶手動或者瀏覽器后退按鈕),那么 URL 地址會重置到 from 路由對應的地址。
- 一個路由地址: 通過一個路由地址跳轉到一個不同的地址,就像你調(diào)用 router.push() 一樣,你可以設置諸如 replace: true 或 name: 'home' 之類的配置。當前的導航被中斷,然后進行一個新的導航,就和 from 一樣。
router.beforeEach(async (to, from) => { if ( // 檢查用戶是否已登錄 !isAuthenticated && // ?? 避免無限重定向 to.name !== 'Login' ) { // 將用戶重定向到登錄頁面 return { name: 'Login' } } })
如果遇到了意料之外的情況,可能會拋出一個 Error。這會取消導航并且調(diào)用 router.onError() 注冊過的回調(diào)。
如果什么都沒有,undefined 或返回 true,則導航是有效的,并調(diào)用下一個導航守衛(wèi)
以上所有都同 async 函數(shù) 和 Promise 工作方式一樣:
router.beforeEach(async (to, from) => { // canUserAccess() 返回 `true` 或 `false` const canAccess = await canUserAccess(to) if (!canAccess) return '/login' })
可選的第三個參數(shù) next
在之前的 Vue Router 版本中,也是可以使用 第三個參數(shù) next 的。這是一個常見的錯誤來源,可以通過 RFC 來消除錯誤。然而,它仍然是被支持的,這意味著你可以向任何導航守衛(wèi)傳遞第三個參數(shù)。在這種情況下,確保 next 在任何給定的導航守衛(wèi)中都被嚴格調(diào)用一次。它可以出現(xiàn)多于一次,但是只能在所有的邏輯路徑都不重疊的情況下,否則鉤子永遠都不會被解析或報錯。這里有一個在用戶未能驗證身份時重定向到/login的錯誤用例:
// BAD router.beforeEach((to, from, next) => { if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' }) // 如果用戶未能驗證身份,則 `next` 會被調(diào)用兩次 next() })
下面是正確的版本:
// GOOD router.beforeEach((to, from, next) => { if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' }) else next() })
總結:
全局前置導航守衛(wèi)
to: 到哪里去,到哪去的完整路由信息對象 (路徑,參數(shù))
from: 從哪里來,從哪來的完整路由信息對象 (路徑,參數(shù))
next(): 是否放行
(1) next() 直接放行,放行到to要去的路徑
(2) next(路徑) 進行攔截,攔截到next里面配置的路徑
到此這篇關于用Vue實現(xiàn)頁面訪問攔截的方法詳解的文章就介紹到這了,更多相關Vue實現(xiàn)頁面訪問攔截內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue+elemen實現(xiàn)el-tooltip在文本超出區(qū)域后浮現(xiàn)
el-tooltip組件本身就是懸浮提示功能,在對它進行二次封裝時,實現(xiàn)超出的文本浮現(xiàn),本文就來介紹一下vue+elemen實現(xiàn)el-tooltip在文本超出區(qū)域后浮現(xiàn),感興趣的可以了解一下2023-12-12vue項目在打包時,如何去掉所有的console.log輸出
這篇文章主要介紹了vue項目在打包時,如何去掉所有的console.log輸出,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04vue+elementui實現(xiàn)動態(tài)添加行/可編輯的table
這篇文章主要為大家詳細介紹了vue+elementui實現(xiàn)動態(tài)添加行/可編輯的table,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07vue+elementui 實現(xiàn)新增和修改共用一個彈框的完整代碼
Element-Ul是餓了么前端團隊推出的一款基于Vue.js 2.0 的桌面端UI框架,手機端有對應框架是Mint UI ,今天給大家普及vue+elementui 實現(xiàn)新增和修改共用一個彈框的完整代碼,一起看看吧2021-06-06解決axios發(fā)送post請求上傳文件到后端的問題(multipart/form-data)
這篇文章主要介紹了如何使用axios發(fā)送post請求上傳文件到后端(multipart/form-data),本文給大家?guī)砹藛栴}原因及解決方案,結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-05-05