Vue項目中實現(xiàn)無感Token刷新的示例
在前端項目中,Token 通常用于用戶認證和權(quán)限管理。無論是基于 JWT (JSON Web Token) 還是其他類型的 Token,它們往往有一個過期時間。當 Token 過期時,用戶的操作會受到影響,因此我們需要一種無感知(或“靜默”)的方式來刷新 Token,確保用戶在會話中的操作不會中斷。
本文將介紹如何在 Vue 項目中實現(xiàn) Token 的無感刷新,包括 Token 刷新的原理、攔截器的應(yīng)用以及如何處理 Token 過期。
一、Token 刷新的背景
通常,Token 分為兩種:
- 訪問令牌 (Access Token):用于每次請求時驗證用戶身份,通常有效期較短。
- 刷新令牌 (Refresh Token):用于刷新訪問令牌,當訪問令牌過期時,可以使用刷新令牌獲取新的訪問令牌。
在實際應(yīng)用中,訪問令牌的有效期較短,主要是為了安全性。當訪問令牌過期時,我們不想強制用戶重新登錄,而是通過刷新令牌來獲取新的訪問令牌,從而實現(xiàn)無感刷新。
二、無感 Token 刷新的實現(xiàn)原理
無感刷新是指在用戶不感知的情況下,當 Token 過期時自動刷新并重新發(fā)起請求。這個過程通常包含以下步驟:
- 每次發(fā)起請求時,檢查訪問令牌的有效性。
- 如果訪問令牌過期,暫停當前請求并使用刷新令牌獲取新的訪問令牌。
- 使用新的訪問令牌重新發(fā)起之前被暫停的請求。
- 更新應(yīng)用中的 Token 信息。
三、在 Vue 項目中實現(xiàn) Token 無感刷新
在 Vue 項目中,我們通常使用 Axios 來處理 HTTP 請求。為了實現(xiàn)無感刷新,我們可以使用 Axios 的攔截器來攔截請求和響應(yīng),檢測 Token 是否過期,并在需要時自動刷新。
1. 配置 Axios 攔截器
首先,我們需要設(shè)置 Axios 的請求和響應(yīng)攔截器:
import axios from 'axios'; import store from '@/store'; // 假設(shè)我們將 token 保存在 Vuex 中 import router from '@/router'; const apiClient = axios.create({ baseURL: process.env.VUE_APP_API_BASE_URL, timeout: 10000 }); // 請求攔截器,攜帶 token apiClient.interceptors.request.use( config => { const accessToken = store.getters['auth/accessToken']; if (accessToken) { config.headers['Authorization'] = `Bearer ${accessToken}`; } return config; }, error => { return Promise.reject(error); } ); // 響應(yīng)攔截器,檢查 token 是否過期 apiClient.interceptors.response.use( response => { return response; }, async error => { const originalRequest = error.config; const refreshToken = store.getters['auth/refreshToken']; // 檢查是否是認證錯誤(如 401) if (error.response.status === 401 && !originalRequest._retry && refreshToken) { originalRequest._retry = true; // 嘗試使用刷新令牌獲取新的訪問令牌 try { const response = await axios.post('/auth/refresh', { token: refreshToken }); const newAccessToken = response.data.accessToken; // 更新存儲中的 token store.commit('auth/SET_ACCESS_TOKEN', newAccessToken); // 重新發(fā)起之前失敗的請求 originalRequest.headers['Authorization'] = `Bearer ${newAccessToken}`; return apiClient(originalRequest); } catch (refreshError) { // 刷新失敗,跳轉(zhuǎn)到登錄頁面 store.commit('auth/LOGOUT'); router.push('/login'); } } return Promise.reject(error); } ); export default apiClient;
2. 關(guān)鍵點解析
請求攔截器:在每次請求發(fā)送前,檢查
accessToken
是否存在,并將其添加到請求頭的Authorization
字段中,確保后端可以識別用戶身份。響應(yīng)攔截器:如果響應(yīng)狀態(tài)碼為
401
,說明訪問令牌無效或過期。此時,會嘗試使用refreshToken
請求新的accessToken
。成功后,更新store
中的accessToken
并重新發(fā)起之前失敗的請求。
3. Vuex 管理 Token
為了更好地管理 Token,我們可以使用 Vuex 來存儲和更新 Token 信息。
// store/modules/auth.js const state = { accessToken: localStorage.getItem('accessToken') || '', refreshToken: localStorage.getItem('refreshToken') || '' }; const getters = { accessToken: state => state.accessToken, refreshToken: state => state.refreshToken }; const mutations = { SET_ACCESS_TOKEN(state, token) { state.accessToken = token; localStorage.setItem('accessToken', token); }, SET_REFRESH_TOKEN(state, token) { state.refreshToken = token; localStorage.setItem('refreshToken', token); }, LOGOUT(state) { state.accessToken = ''; state.refreshToken = ''; localStorage.removeItem('accessToken'); localStorage.removeItem('refreshToken'); } }; export default { state, getters, mutations };
在 Vuex 中,我們使用 localStorage
來持久化 accessToken
和 refreshToken
,這樣即使用戶刷新頁面,Token 也不會丟失。
四、自動刷新和用戶體驗
Token 無感刷新極大地提升了用戶體驗,因為用戶在 Token 過期時無需重新登錄。但需要注意以下幾點:
- 安全性:刷新令牌的有效期應(yīng)比訪問令牌長,且只能使用一次,防止濫用。
- 定時刷新:可以在前端設(shè)置一個定時器,在 Token 過期前自動刷新,而不是等到請求 401 錯誤時才刷新。
- 用戶操作:在刷新令牌也過期時,需要引導用戶重新登錄。
五、總結(jié)
在 Vue 項目中實現(xiàn)無感 Token 刷新,可以確保用戶在 Token 過期時不會被強制登出或中斷操作。通過 Axios 攔截器和 Vuex 的結(jié)合,我們可以實現(xiàn)自動化的 Token 管理和刷新流程。這不僅提升了安全性,也為用戶提供了更加流暢的使用體驗。
到此這篇關(guān)于Vue項目中實現(xiàn)無感Token刷新的示例的文章就介紹到這了,更多相關(guān)Vue 無感Token刷新內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Vue sessionStorage實現(xiàn)保留搜索框搜索內(nèi)容
這篇文章主要介紹了基于Vue sessionStorage實現(xiàn)保留搜索框搜索內(nèi)容,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06vue3+el-table封裝示例詳解(編輯、刪除、查看詳情按鈕一起封裝)
在Vue3中,利用Element?Plus?UI庫封裝表格組件,實現(xiàn)編輯、刪除和查看詳情的功能,通過定義tableData和tableDataHeader來管理表格數(shù)據(jù)和表頭,其中tableData通常從后端獲取,而tableHeader可根據(jù)具體需求自定義,感興趣的朋友跟隨小編一起看看吧2024-09-09vue路由 遍歷生成復數(shù)router-link的例子
今天小編就為大家分享一篇vue路由 遍歷生成復數(shù)router-link的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10淺談vue后臺管理系統(tǒng)權(quán)限控制思考與實踐
這篇文章主要介紹了淺談vue后臺管理系統(tǒng)權(quán)限控制思考與實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Vue+element 解決瀏覽器自動填充記住的賬號密碼問題
我們在做form表單的時候,會發(fā)現(xiàn),瀏覽器會自動的將我們之前保存的密碼,自動的填充到表單中input 為 type="password" 的框中,如何實現(xiàn)此功能呢,下面小編給大家介紹下,感興趣的朋友一起看看吧2019-06-06使用Vue和ECharts創(chuàng)建交互式圖表的代碼示例
在現(xiàn)代 Web 應(yīng)用中,數(shù)據(jù)可視化是一個重要的組成部分,它不僅能夠幫助用戶更好地理解復雜的數(shù)據(jù),還能提升用戶體驗,本文給大家使用Vue和ECharts創(chuàng)建交互式圖表的示例,需要的朋友可以參考下2024-11-11詳解vuejs2.0 select 動態(tài)綁定下拉框支持多選
這篇文章主要介紹了vuejs2.0 select動態(tài)綁定下拉框 ,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04