刷新token和token是否過期的操作都是由后端實現,前端只負責根據code的不同狀態來做不同的操作:
一、判斷token是否過期、失效
舉例:一般響應狀態碼 code :0,表示請求成功。①響應狀態碼 code:10010表示token過期 ②響應狀態碼 code:10011 表示token無效。這些狀態碼都由你自己和后端的同學一起定義。code等於10010和10011這兩種狀態都會跳轉到登錄頁,重新進行登錄並獲取最新的token。
二、在一定時間內刷新token
為什么需要刷新token?因為出於安全性的考慮,一般是一天或幾個小時更新token,看項目需要。
怎么實現?我和后端的同學是這么定義的,在發送任何一次請求時,如果需要更新token,響應體中后端的同學給我返回了token這個字段,token出現在了響應體中,說明這時候是需要刷新token的(其他非刷新token的請求時是沒有token字段的),這時用localStorage保存最新token,自動覆蓋掉原來舊的token,這樣下次再調用新接口時用的就是最新的token了,這樣用戶也感知不到token更新的過程。
三、具體實現
/** * 全局變量 和 設置 、配置等。。。 */ import axios from 'axios' // 引入axios import Storage from '@/assets/js/util/storage.js' // storage工具類,簡單的封裝 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded' /* 請求攔截器 */ axios.interceptors.request.use(function (config) { // 每次請求時會從localStorage中獲取token let token = Storage.localGet('token') if (token) { token = 'bearer' + ' ' + token.replace(/'|"/g, '') // 把token加入到默認請求參數中 config.headers.common['Authorization'] = token } return config }, function (error) { return Promise.reject(error) }) /* 響應攔截器 */ axios.interceptors.response.use(function (response) { // ①10010 token過期(30天) ②10011 token無效 if (response.data.code === 10010 || response.data.code === 10011) { Storage.localRemove('token') // 刪除已經失效或過期的token(不刪除也可以,因為登錄后覆蓋) router.replace({ path: '/login' // 到登錄頁重新獲取token }) } else if (response.data.token) { // 判斷token是否存在,如果存在說明需要更新token Storage.localSet('token', response.data.token) // 覆蓋原來的token(默認一天刷新一次) } return response }, function (error) { return Promise.reject(error) })
緩存工具類 Storage
var Storage = { // ==================sessionsTorage設置緩存================ // 設置緩存 sessionSet: function (name, data) { sessionStorage.removeItem(name) sessionStorage.setItem(name, JSON.stringify(data)) }, // 獲取緩存 sessionGet: function (name) { return JSON.parse(sessionStorage.getItem(name)) }, // 清除緩存 sessionRemove: function (name) { sessionStorage.removeItem(name) }, // ==================localStorage設置緩存================== // 設置緩存 localSet: function (name, data) { localStorage.removeItem(name) localStorage.setItem(name, JSON.stringify(data)) }, // 獲取緩存 localGet: function (name) { return JSON.parse(localStorage.getItem(name)) }, // 清除緩存 localRemove: function (name) { localStorage.removeItem(name) } } export default Storage