axios request和response拦截器

main.js

axios.interceptors.request.use(config => {
    if(store.state.token){
      var str = store.state.token;
      
      // config.headers.common['Authorization']='JWT '+str;
      config.headers.Authorization=`JWT ${str}`
  
    }
    return config;
  }, error => {
  // 对请求错误做些什么
    return Promise.reject(error);
  });
// http response 拦截器
axios.interceptors.response.use(
  response => {
    return response;
  },
  error => {

    if (error.response) {
    
      switch (error.response.status) {
        case 401:
            axios.get('/api/users/quit',{params:{'time_uuid':store.state.timeUUid}}).then(res => {
              //清空储存登录时间开始
              
              store.commit('del_token','');
              store.commit('del_timeUUID','');
              //清空储存登录时间结束
              
            }).then(res => {
                Message({duration:1000,message:'请重新登录,正在前往登录页...',type:'warning',onClose:res =>{
                  router.replace({
                    path: '/login',
                    query: {redirect: router.currentRoute.fullPath}//登录成功后跳入浏览的当前页面
                  })
                }})         
            })
          break;
            
      }
    }
    return Promise.reject(error.response.data)
  })

2020/4/30 新项目的需求对于拦截器响应器的封装优化
main.js
对于请求拦截器当中对于headers的设置中 Content-Type的设置要求为如果请求当中设置Content-Type值则以页面中的请求参数为准,否则为默认的application/json

// 添加请求拦截器,在请求头中加token
axios.interceptors.request.use(config => {
  if(store.state.xaiot_token){
    if(config.method === 'post'){
      config.headers['usid']=`${store.state.xaiot_token}`
      if(config.headers['Content-Type'] === undefined)
        config.headers['Content-Type']='application/json'
      else 
        config.headers['Content-Type']=config.headers['Content-Type']
      if(config.headers['Accept'] === undefined)
        config.headers['Accept']='application/json'
      else
        config.headers['Accept']=config.headers['Accept']
    }
  }
  return config;
}, error => {
// 对请求错误做些什么
  return Promise.reject(error);
});

后端给的响应数据当中返回的数据外面都是报过了一层status=200的 意味着所有的信息包括报错的token超时等等各类信息都会是status200内的data信息,而我封装响应拦截器的时候给默认的认为是接口请求错误的因为接口正常的状态码和token信息的一些特殊的code是确定的,界面其他人对接api的时候不仅判断了code=‘0000’(正常请求接口)的情况还在else if(code !==‘0000’)里面判断了不是正常请求接口时候的弹框,这样两者的判断范围有交叉,就会弹两次框提示,最后我们就要做到如果如果类似于接口请求错误这样的反馈我们就 让他在页面走不下去,直接走catch方法,就避免了重复弹框的问题,

// http response 拦截器
axios.interceptors.response.use(
  response => {
    let response_Result=response
    if(response_Result.data.code){//导出这类接口没有code success
      switch (response_Result.data.code) {
        case '0000'://请求成功不管  要想谈成功提示框可以在界面进行提示   接口访问和读取数据正常
          return response_Result
        case '10011'://10011   请检查登录是否携带token
            message({duration:1000,message:response_Result.data.msg,type:'error',onClose:res =>{
              //清空token并跳转
              localStorage.clear()
              sessionStorage.clear()
              router.replace({
                path: '/login',
                query: {redirect: router.currentRoute.fullPath}//登录成功后跳入浏览的当前页面
              })
            }})
            response_Result.data={}
            return response_Result
        case '10012':// 10012   token不能为空
            message({duration:1000,message:response_Result.data.msg,type:'error',onClose:res =>{
              //清空token并跳转
              localStorage.clear()
              sessionStorage.clear()
              router.replace({
                path: '/login',
                query: {redirect: router.currentRoute.fullPath}//登录成功后跳入浏览的当前页面
              })
            }})
            response_Result.data={}
            return response_Result
        case '10013':// 10013   会话超时,需重新登录
            message({duration:1000,message:response_Result.data.msg,type:'error',onClose:res =>{
              //清空token并跳转
              localStorage.clear()
              sessionStorage.clear()
              router.replace({
                path: '/login',
                query: {redirect: router.currentRoute.fullPath}//登录成功后跳入浏览的当前页面
              })
            }})
            response_Result.data={}
            return response_Result
        case '10014':// 10014   当前用户无权限内容
          message({duration:1000,message:response_Result.data.msg,type:'error'})   
          response_Result.data={}
          return response_Result
        case '10015':// 10015   当前用户权限获取失败
          message({duration:1000,message:response_Result.data.msg,type:'error'})   
          response_Result.data={}
          return response_Result
        default :  
          //默认接口请求报错  除code值为0000/10011/10012/10013/10014/10015之外  默认走这块 
          //先将默认接口给返回的信息msg获取到,用于做提示框信息,然后给准备返回的response数据其他全部滞空,将status修改为40001
          //这样接口就直接在第一个if判断code或者msg或者success字段时直接抛异常走catch方法 
          //就可以将页面当中其他员工写的请求接口错误的弹框信息和拦截器的判断重叠多次弹相同信息的问题完美解决
          let message_content = response_Result.data.msg
          response_Result={
            status:40001
          }
          message({duration:1000,message:message_content,type:'error'})   
          return response_Result
      }
    }
    return response_Result
  },
  error => {
    debugger
    if (error.response) {
      switch (error.response.status) {
        case 401:
            message({duration:1000,message:'请重新登录,正在前往登录页...',type:'warning',onClose:res =>{
              //清空token并跳转
              localStorage.clear()
              sessionStorage.clear()
              isShowMessage=true
              router.replace({
                path: '/login',
                query: {redirect: router.currentRoute.fullPath}//登录成功后跳入浏览的当前页面
              })
            }})      
          break;
      }
    }
    return Promise.reject(error)
  })

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值