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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM