浅谈Vue网络请求之interceptors实际应用
项目背景
最近在项目开发中,遇到下面这样一个问题:
- 在进行铭感操作之前,每个请求需要携带token,但是token有有效期,token失效后需要换取新的token并继续请求。
需求分析
- 每个请求都需要携带token,所以我们可以使用axiosrequest拦截器,在这里,我们给每个请求都加token,这样就可以节省每个请求再一次次的复制粘贴代码。
- token失效问题,当我们token失效,我们服务端会返回一个特定的错误表示,比如tokeninvalid,但是我们不能在每个请求之后去做刷新token的操作呀,所以这里我们就用axiosresponse拦截器,我们统一处理所有请求成功之后响应过来的数据,然后对特殊数据进行处理,其他的正常分发。
功能实现
分析完问题后,我们来实现功能
安装axios,这里我们就赘述怎么安装axios.
在main.js注册axios
Vue.use(Vuex) Vue.use(VueAxios,axios) Vue.use(qs)
注:qs,使用axios,必须得安装qs,所有的Post请求,我们都需要qs,对参数进行序列化。
在request拦截器实现
axios.interceptors.request.use(
config=>{
config.baseURL='/api/'
config.withCredentials=true//允许携带token,这个是解决跨域产生的相关问题
config.timeout=2500
lettoken=sessionStorage.getItem('access_token')
letcsrf=store.getters.csrf
if(token){
config.headers={
'access-token':token,
'Content-Type':'application/x-www-form-urlencoded'
}
}
if(config.url==='refresh'){
config.headers={
'refresh-token':sessionStorage.getItem('refresh_token'),
'Content-Type':'application/x-www-form-urlencoded'
}
}
returnconfig
},
error=>{
returnPromise.reject(error)
}
)
在response拦截器实现
axios.interceptors.response.use(
response=>{
//定时刷新access-token
if(!response.data.value&&response.data.data.message==='tokeninvalid'){
//刷新token
store.dispatch('refresh').then(response=>{
sessionStorage.setItem('access_token',response.data)
}).catch(error=>{
thrownewError('token刷新'+error)
})
}
returnresponse
},
error=>{
returnPromise.reject(error)
}
)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。