axios拦截器已经封装好,需要单独在页面接口重新赋值新的token

文章介绍了如何在Vue项目中通过main.js引入并全局配置Axios拦截器,用于处理请求头、异常状态(如401、500)以及IE浏览器的缓存问题。拦截器还包含了处理token过期的情况,自动重新获取新token并刷新会话。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

处理方式:

在入口文件main.js里引入封装好的axios拦截器

import axios from './utils/request'

Vue.prototype.$http = axios

页面使用

 this.$http({

              headers: {

                'x-Authorization': storage.get('logoutToken')

              },

              url: '/users/login',

              method: 'delete',

              data: { exit_time: storage.get('logoutTime') }

            }).then(res => {

            })

这样就可以任意定义了

拦截器封装的api接口函数页面使用方式:

import request from '@/utils/request'

// 退出登录

export function loginOut(query) {

  return request({

    url: '/users/login',

    method: 'delete',

    data: query

  })

}

utils的request文件里封装的拦截器如下:

里面会处理ie浏览器缓存的不请求接口的问题,还有token到期后,接口重新返回新的token重新赋值的问题

import axios from 'axios'

import store from '@/store'

import { getToken, setToken } from '@/utils/auth'

import Vue from 'vue'

import router from '@/router'

import 'babel-polyfill'

import Es6Promise from 'es6-promise'

require('es6-promise').polyfill()

Es6Promise.polyfill()

// create an axios instance

const request = axios.create({

  baseURL: process.env.VUE_APP_BASE_API,

  timeout: 10 * 1000 // request timeout

})

axios.defaults.headers.delete['Content-Type'] = 'application/json;charset=UTF-8';

// 异常拦截处理器 成功1 失败0 错误 -1

const errorHandler = (error) => {

  if (error) {

    const data = error.data

    const token = store.getters.token

    switch (error.status) {

      case 403:

        Vue.prototype.$notify({

          message: 'Forbidden',

          type: 'error',

          description: data.message

        });

        break;

      case 401:

        // 测试注释后就可以 禁止401后跳转登录页

        if (!(data.result && data.result.isLogin)) {

          if (token) {

            // 退出登录跳转

            store.dispatch('user/resetToken').then(() => {

              setTimeout(() => {

                window.location.reload()

              }, 100)

            })

          }

        }

        break;

      case 308:

        Vue.prototype.$notify({

          message: '密码到期',

          type: 'error'

        })

        router.replace('/editPwd')

        break;

      case 307:

        Vue.prototype.$notify({

          message: '授权到期',

          type: 'error'

        })

        break;

      case 500:

        Vue.prototype.$notify({

          message: '网络错误,请稍后重试',

          type: 'error'

        })

        break;

    }

  }

  return Promise.reject(error)

}

// request interceptor 请求拦截器

request.interceptors.request.use(

  config => {

    // do something before request is sent

    if (store.getters.token) {

      config.headers['x-Authorization'] = getToken()

      // 时间戳,解决ie浏览器请求一次,不请求,获取缓存的bug

      var timeArs = parseInt(new Date().getTime() / 1000) + ''

      if (config.method === 'get') {

        // `${config.url}?${timeArs}`,

        /* get 接口 在 IE11 中,如果 GET 请求相同的 URL ,浏览器默认会使用之前的缓存数据,而不是重新请求接口,导致页面数据没有更新 */

        config.params = {

          _t: timeArs,

          ...config.params

        }

      }

    }

    return config

  }, errorHandler)

// response interceptor 响应拦截器

request.interceptors.response.use(

  res => {

    // 获取接口返回的请求头中新添加的token,更新本地的token

    if (res.headers['x-authorization']) {

      // 定义赋值新的token

      const newToken = res.headers['x-authorization']

      // 更新新的token

      setToken(newToken)

      // 再发请求 request(res.config)  清空之前的baseURL否则会多一层

      res.config.baseURL = ''

      return request(res.config)

    }

    if (res.headers['content-disposition'] !== undefined) {

      return res

    } else {

      if (res.status === 200) {

        return Promise.resolve(res.data)

      } else {

        return Promise.reject(res.data)

      }

    }

  },

  error => {

    const { response } = error;

    if (response) {

      // 请求已发出,但是不在2xx的范围

      errorHandler(response)

    }

  })

export default request


 

在 Vue 项目中,可以通过以下步骤封装 axios请求拦截和响应拦截: 1. 安装 axios ``` npm install axios --save ``` 2. 创建一个 axios 实例 在项目中,一般会有多个接口请求,为了方便管理和配置,可以创建一个 axios 实例来处理所有的请求。在 `src` 目录下新建一个 `api` 文件夹,然后在该文件夹下新建一个 `http.js` 文件,输入以下代码: ```JavaScript import axios from 'axios' const http = axios.create({ baseURL: process.env.VUE_APP_BASE_URL, timeout: 5000, headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) export default http ``` 上述代码中,我们创建了一个名为 `http` 的 axios 实例,并设置了一些默认配置,如请求的基础 URL、请求超时时间、请求头等。 3. 设置请求拦截器 请求拦截器可以在请求发送前做一些处理,如添加请求头、添加 loading 等。在 `http.js` 文件中添加以下代码: ```JavaScript http.interceptors.request.use(config => { // 添加 loading // ... // 添加请求头 // ... return config }, error => { return Promise.reject(error) }) ``` 4. 设置响应拦截器 响应拦截器可以在接收到响应后做一些处理,如判断响应状态码、关闭 loading 等。在 `http.js` 文件中添加以下代码: ```JavaScript http.interceptors.response.use(response => { // 判断响应状态码 if (response.status === 200) { return Promise.resolve(response.data) } else { return Promise.reject(new Error(response.statusText)) } // 关闭 loading // ... }, error => { return Promise.reject(error) }) ``` 5. 通过 `http` 实例发送请求 在需要发送请求的组件中,可以通过 `http` 实例发送请求。例如,获取用户列表的代码如下所示: ```JavaScript import http from '@/api/http' export default { data() { return { userList: [] } }, mounted() { http.get('/user/list').then(res => { this.userList = res.data }) } } ``` 上述代码中,我们通过 `http` 实例发送了一个 GET 请求请求的 URL 为 `/user/list`。请求成功后,将响应数据赋值给 `userList`。 通过以上步骤,我们就成功地封装axios请求拦截和响应拦截。在实际开发中,我们还可以根据项目需求进行更加复杂的封装
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值