axios的拦截器

本文详细介绍了axios的请求拦截器和响应拦截器的用法,用于处理请求前的token注入和响应后的数据异常处理。在响应拦截器中,针对success:false判断操作失败,并处理token超时情况,实现自动登出并跳转到登录页面。
摘要由CSDN通过智能技术生成

1.请求拦截器主要完成 token的统一注入

是否有token,设置请求头

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });


2.响应拦截器主要处理 返回的数据异常数据结构问题

1)根据是否有 success:false 来判断操作是否成功(写在response)

2)超出2xx范围的状态码都会触发该函数(error):token失效

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

例子

// 对axios二次封装
// 1.基地址
// 2.最长等待时间
// 3.请求拦截器
// 4.响应拦截器

// 导出一个axios的实例  而且这个实例要有请求拦截器 响应拦截器
import axios from 'axios'
import store from '@/store' 
import router from "@/router"

// 创建一个axios的实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  // 'http://ihrm-java.itheima.net', // 设置axios请求的基础的基础地址
  timeout: 5000 // 定义5秒超时
}) 

// 请求拦截器
service.interceptors.request.use(
  function(config) {
    // 在发送请求之前做些什么
    console.log('请求拦截器', store)
    // 如果有token 就带上
    // 获取vuex中的token
    const token = store.state.user.token
    if (token) {
      // 设置请求头
      config.headers.Authorization = `Beare ${token}`
    }
    return config
  },
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
service.interceptors.response.use(
  function(response) {
    // 对响应数据做点什么
    // 根据是否有 success:false 来判断是否
    // console.log('响应拦截器', response)
    // 1.判断操作是否成功
    if (response.data.success === false) {
      // 本次操作没有成功,抛出错误
      return Promise.reject(response.data.message)
    } else {
      // 2.操作成功,脱壳,去掉data
      return response.data
    }
  },
  function(error) {
    // 超出2xx范围的状态码都会触发该函数
    // 对响应错误做点什么
    console.dir('error',error)
    if(error.response.data.code===10002){
      // token超时
      // 1.本地数据删除
      store.dispatch('user/logout')
      // 2.回到登录页
      // this.$router.push('/login?return_url='+encodeURIComponent(this.$route.fullPath))
      // 如何在.js文件中拿到当前的路由的path?  router.currentRoute.fullPath
      router.push('/login?return_url='+encodeURIComponent(router.currentRoute.fullPath))
    }
    return Promise.reject(error)
  }
)
export default service // 导出axios实例

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值