Vue axios拦截器相同请求二次请求失败

        最近,使用jwt来进行前后端身份认证。前端就使用到了axios的拦截器对所有请求进行拦截并为其请求头添加上Authorization属性,值为jwt。

        但是出现了个很奇怪的现象,相同的请求第一次正常,刷新网页进行第二次请求就会报403错误,看了一下请求头,Authorization没有被加上去,看了一下后端的输出jwt也是null的。

        后面搜了一下,看很多文都是说因为请求数据被缓存,相同请求第二次直接用缓存了就没走拦截器也就没添加上jwt。他们的解决方法也都是一致的,启动axios的禁用缓存配置,还有就是往请求头里面加时间戳,这样系统就不会判断两次请求是一样的,也就不会走缓存。

// 禁用缓存
axios.defaults.headers.common['Cache-Control'] = 'no-cache' 

        But!!!

        都试了没用,后面才反应过来,我这个和他们不是一个错,前面说到我后端输出了jwt为null的信息,说明第二个请求是有发出去的,并不是直接拿的缓存数据。

        后面继续查资料,发现我请求拦截器是写到main.js里面的,这样是不行的,重新创一个xxx.js文件放进去然后在main.js里面import store from './xxx'引进来就解决了!!!

// 请求拦截器, 每次请求都会在请求头中携带token
axios.interceptors.request.use((config) => {
  if(localStorage.getItem('Authorization')) {
    config.headers.Authorization = localStorage.getItem('Authorization')
  }
  return config;
}, (error) => {
  return Promise.reject(error);
})

        查了下资料,这是因为在JavaScript中,每个文件都有自己的作用域。当将axios拦截器定义在main.js文件中时,它只会在应用程序启动时执行一次,并且只会对在该文件中发送的请求起作用。如果在其他文件中发送请求,则不会使用该拦截器。

        解决方法是将axios拦截器定义在单独的文件中,然后在main.js中引入该文件。这样,拦截器将被定义为全局拦截器,并可以在整个应用程序中使用。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue中使用Axios拦截器可以在发送请求或响应返回前对其进行一些处理。拦截器可以用来添加公共headers、设置loading状态、处理错误等。 首先,你需要安装并导入Axios库。然后在Vue组件中定义拦截器。以下是一个简单的示例: ```javascript // main.js import axios from 'axios'; axios.interceptors.request.use( config => { // 在请求发送前做一些处理,比如添加headers config.headers['Authorization'] = 'Bearer token'; return config; }, error => { // 处理请求错误 return Promise.reject(error); } ); axios.interceptors.response.use( response => { // 在响应返回前做一些处理,比如解析数据 return response; }, error => { // 处理响应错误 return Promise.reject(error); } ); // Vue组件中使用Axios export default { data() { return { responseData: null, loading: false }; }, methods: { fetchData() { this.loading = true; axios.get('/api/data') .then(response => { this.responseData = response.data; this.loading = false; }) .catch(error => { console.error(error); this.loading = false; }); } } }; ``` 在上面的示例中,我们定义了两个拦截器:一个用于请求发送前处理,一个用于响应返回前处理。在请求拦截器中,我们可以添加headers等信息;在响应拦截器中,我们可以对响应数据进行处理。 同时,在Vue组件中使用Axios发送请求时,我们可以通过`then`和`catch`方法来处理响应和错误。在这个示例中,我们设置了一个`loading`状态来展示加载状态,当请求成功后,将返回的数据保存在`responseData`中。 这只是一个简单的示例,你可以根据自己的需求来进行更复杂的处理。希望对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值