В последние несколько дней проект был протестирован, и тест принес мне ошибку, говорящую о том, что срок действия токена истек, и маршрут должен автоматически перейти на страницу входа, чтобы позволить пользователю снова войти в систему. Давайте сначала поговорим о некоторых предварительных условиях. 1. Срок действия токена моей компании в производственной среде установлен на один час. Когда срок действия токена истечет, все интерфейсы вернутся напрямую. 2: каждый раз, когда маршрут перескакивает, будет оцениваться токен, и устанавливается глобальная функция хука beforeEach.Если токен существует, он перейдет на нужную вам страницу.В противном случае он перейдет прямо на страницу входа, что позволит пользователя для входа в систему и повторного доступа к токену.
接口返回的信息
{
code:10009,
msg:'token过期',
data:null
}
全局的路由钩子函数
router.beforeEach(async(to, from, next) => {
//获取token
// determine whether the user has logged in
const hasToken = getToken()
if (hasToken) {
//token存在,如果当前跳转的路由是登录界面
if (to.path === '/login') {
// if is logged in, redirect to the home page
next({ path: '/' })
NProgress.done()
} else {
//在这里,就拉去用户权限,判断用户是否有权限访问这个路由
} catch (error) {
// remove token and go to login page to re-login
await store.dispatch('user/resetToken')
Message.error(error || 'Has Error')
next(`/login?redirect=${to.path}`)
NProgress.done()
}
} else {
//token不存在
if (whiteList.indexOf(to.path) !== -1) {
//如果要跳转的路由在白名单里,则跳转过去
next()
} else {
//否则跳转到登录页面
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
})
Таким образом, я напрямую перехватываю все запросы.Когда код, возвращаемый ответными данными, равен 10009, я напрямую очищаю информацию о пользователе и перезагружаю страницу. Я упростил код, потому что пользователь сохранит токен, имя и информацию о правах доступа в файле store/user.js при входе в систему, поэтому, пока срок действия токена истечет, информация в пользовательском файле будет очищена. Таким образом, после истечения срока действия токена при обновлении страницы или переходе к компоненту будет вызываться глобальное решение beforeEach, а когда информация о токене не существует, он будет напрямую переходить на страницу входа.
import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000
})
//发送请求时把token携带过去
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['sg-token'] = getToken()
}
return config
},
error => {
console.log(error)
return Promise.reject(error)
}
)
service.interceptors.response.use(
response => {
console.log(response.data)
const res = response.data
// token过期,重返登录界面
if (res.code === 10009) {
store.dispatch('user/logout').then(() => {
location.reload(true)
})
}
return res
},
error => {
console.log('err' + error) // for debug
Message({
message: error.msg,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
}
)
export default service
Итак, обмен токенами здесь.Приведенный выше код заменяется вашими данными в соответствии с ситуацией в вашем проекте.Если есть какая-либо ошибка, пожалуйста, укажите на нее!