axios踩坑笔记

axios踩坑之请求拦截器

1.问题与解决方法

近日在使用vuecli进行前端开发时,后端返回的token每次请求后都会改变,遇到了刷新页面时出现请求失败401的问题,太过相信axios,找了好几天才发现,不知何种原因,axios的请求拦截器对于在vue页面的created方法中的请求并没有执行拦截处理,所以请求头没有权限信息,因而返回401 !!!

解决方法:

1.在页面的created方法设置请求头Authorization参数(麻烦,不推荐)

2.在响应拦截器设置请求头Authorization参数

2.代码部分

以下为有问题的代码

vue部分
created: function () {
      this.getData();
      
    },
    methods:{
      //获取数据到页面的表格 
      getData(){
          //设置页码
        var send =this.pos.start;
      this.$http.get('/task/listUnacceptedTask/'+send)
      .then(response => {
           console.log(response.data);
              this.tableData = JSON.parse(JSON.stringify(response.data));
            });
          //获取分页部分
        this.getPage();
      }
    }
axios拦截器部分
import axios from 'axios'
import router from './router'

export default()=>{

   axios.defaults.baseURL = 'baseURL'; // 配置axios请求的地址
   axios.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';
   axios.defaults.crossDomain = true;  //设置cross跨域 
  
 
   //配置发送请求前的拦截器 可以设置token信息 
   axios.interceptors.request.use(config => {
       var token = localStorage.getItem('token');
       axios.defaults.headers.common['Authorization'] = token;
           return config;
       }, error => {
           loadingInstance.close();
           return Promise.reject(error);
       });
// 配置响应拦截器 
   axios.interceptors.response.use(res => {
       //对响应数据做些事
       console.log(res.status);  
       const authorization = res.headers.authorization;
       localStorage.setItem('token',authorization);
       console.log(authorization);
       if(typeof(localStorage.getItem('token'))!=undefined&&typeof(localStorage.getItem('token'))!=null)
       localStorage.setItem('islogin',1);
       
    return Promise.resolve(res);
      
   	},
   	error => {
       if(error.response.status=="401"){
        localStorage.setItem('token',null);
        localStorage.setItem('islogin',0);
        //全局登陆过滤,当判读token失效或者没有登录时 返回登陆页面
        router.push('/');
        return false;
    };
   	  alert('请求失败,请稍后重试!')
   	  return Promise.reject(error)
   	}
   		
   	);

   return axios;
    }


使用方法二处理

axios拦截器部分
import axios from 'axios'
import router from './router'

export default()=>{

   axios.defaults.baseURL = 'baseURL'; // 配置axios请求的地址
   axios.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';
   axios.defaults.crossDomain = true;  //设置cross跨域 
  
 
   //配置发送请求前的拦截器 可以设置token信息 
   axios.interceptors.request.use(config => {
       
           return config;
       }, error => {
           loadingInstance.close();
           return Promise.reject(error);
       });
// 配置响应拦截器 
   axios.interceptors.response.use(res => {
       //对响应数据做些事
       console.log(res.status);  
       const authorization = res.headers.authorization;
       axios.defaults.headers.common['Authorization'] = authorization;
       console.log(authorization);
       if(typeof(localStorage.getItem('token'))!=undefined&&typeof(localStorage.getItem('token'))!=null)
       localStorage.setItem('islogin',1);
       
    return Promise.resolve(res);
      
   	},
   	error => {
       if(error.response.status=="401"){
        localStorage.setItem('token',null);
        localStorage.setItem('islogin',0);
        //全局登陆过滤,当判读token失效或者没有登录时 返回登陆页面
        router.push('/');
        return false;
    };
   	  alert('请求失败,请稍后重试!')
   	  return Promise.reject(error)
   	}
   		
   	);

   return axios;
    }


最后:以上仅代表个人见解,如果有错误欢迎各位大佬指正

当然,作为一个自学了1个多月前端的小白,如果代码有什么错误也欢迎各位指出

附录:

1.前端解决浏览器跨域请求问题:https://www.cnblogs.com/ysx215/p/11446615.html

2.http自定义请求头的获取:https://segmentfault.com/a/1190000009125333

posted @ 2020-06-03 22:42  wshope  阅读(1161)  评论(2编辑  收藏  举报