import store from ‘@/store’ // 引入vuex中的store实例
import router from ‘@/router’ // 引入路由对象实例
……
// 响应拦截器
instance.interceptors.response.use(
function (response) {
try {
// 返回具体有价值的业务数据
return response.data.data
} catch (error) {
return response.data
}
},
async function (error) {
// 响应有错误,有可能错误状态码为401
if (error.response && error.response.status===401) {
// 定义登录路由对象
let toPath={
name: ‘login’,
query: { redirectUrl: router.currentRoute.path }
} // 跳转对象
// 如果refresh_token不存在
if (!store.state.user.refresh_token) {
router.push(toPath)
return Promise.reject(error)
}
try {
// 刷新用户token
// 应该发送一个请求 换取新的token
// 这里不应该再用instance 因为 instance会再次进入拦截器 用默认的axios
let result=await axios({
method: ‘put’,
url: ‘http://ttapi.research.itcast.cn/app/v1_0/authorizations’,
headers: {
Authorization: `Bearer ${store.state.user.refresh_token}`
}
})
// 获取到新token后,就对vuex和localStorage进行更新
store.commit(‘updateUser’, {
token: result.data.data.token, // 拿到新的token之后
refresh_token: store.state.user.refresh_token // 将之前 refresh_token 14天有效期
})
return instance(error.config) // 把刚才错误的请求再次发送出去 然后将promise返回
} catch (err) {
// 如果错误 表示补救措施也没用了(有可能refresh_token也失效了)
// 应该跳转到登录页 并且 把废掉的用户信息全都干掉
store.commit(‘clearUser’) // 所有的用户信息清空
router.push(toPath) // 跳转到回登录页
return Promise.reject(err)
}
}
return Promise.reject(error)
}
)
‘) // 所有的用户信息清空
router.push(toPath) // 跳转到回登录页
return Promise.reject(err)
}
}
return Promise.reject(error)
}
)
import router from ‘@/router’ // 引入路由对象实例
……
// 响应拦截器
instance.interceptors.response.use(
function (response) {
try {
// 返回具体有价值的业务数据
return response.data.data
} catch (error) {
return response.data
}
},
async function (error) {
// 响应有错误,有可能错误状态码为401
if (error.response && error.response.status===401) {
// 定义登录路由对象
let toPath={
name: ‘login’,
query: { redirectUrl: router.currentRoute.path }
} // 跳转对象
// 如果refresh_token不存在
if (!store.state.user.refresh_token) {
router.push(toPath)
return Promise.reject(error)
}
try {
// 刷新用户token
// 应该发送一个请求 换取新的token
// 这里不应该再用instance 因为 instance会再次进入拦截器 用默认的axios
let result=await axios({
method: ‘put’,
url: ‘http://ttapi.research.itcast.cn/app/v1_0/authorizations’,
headers: {
Authorization: `Bearer ${store.state.user.refresh_token}`
}
})
// 获取到新token后,就对vuex和localStorage进行更新
store.commit(‘updateUser’, {
token: result.data.data.token, // 拿到新的token之后
refresh_token: store.state.user.refresh_token // 将之前 refresh_token 14天有效期
})
return instance(error.config) // 把刚才错误的请求再次发送出去 然后将promise返回
} catch (err) {
// 如果错误 表示补救措施也没用了(有可能refresh_token也失效了)
// 应该跳转到登录页 并且 把废掉的用户信息全都干掉
store.commit(‘clearUser’) // 所有的用户信息清空
router.push(toPath) // 跳转到回登录页
return Promise.reject(err)
}
}
return Promise.reject(error)
}
)
‘) // 所有的用户信息清空
router.push(toPath) // 跳转到回登录页
return Promise.reject(err)
}
}
return Promise.reject(error)
}
)
© 版权声明
文章版权归作者所有,未经允许请勿转载。