Vue项目二次封装request并且使用拦截器增加请求头token

简介: Vue项目二次封装request并且使用拦截器增加请求头token

vue项目中如果使用到登录注册会用到token,这里需要我们在二次封装的request中设置拦截器,

首先在plugins文件下新建一个reques.js

import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router/index.js'
var CancelToken = axios.CancelToken
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 15000 // request timeout
})
// request interceptor 请求之前拦截判断,权限等处理
service.interceptors.request.use(
  (config) => {
    // do something before request is sent
    if (!localStorage.getItem('token')) {
      router.replace({
        name: '/loginPage'
      })
    } else {
      config.headers['token'] = localStorage.getItem('token')
    }
    config.cancelToken = new CancelToken(e => {
      store.state.axiosCancel.push(e)
    })
    // if (store.getters.token) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      // config.headers['X-Token'] = getToken()
    // }
    return config
  },
  (error) => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)
// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
   */
  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  (response) => {
    const res = response.data
    if (!res.data) {
      if (res.code === '200') {
        return Promise.reject(new Error('数据异常!'))
        // localStorage.removeItem('token');
      } else {
        return res
      }
    } else if (res.data instanceof Array) {
      if (res.data.length === 0) {
        return Promise.reject(new Error('数据异常!'))
      } else {
        return res
      }
    } else {
      return res
    }
    // var str = JSON.stringify(res)
    // var json = JSON.parse(str)
    // console.log(json)
    // if the custom code is not 20000, it is judged as an error.
    // if (res.code !== 20000 && res.code !== 0) {
    //   // Message({
    //   //   message: res.message || 'Error',
    //   //   type: 'error',
    //   //   duration: 5 * 1000
    //   // })
    //   // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
    //   if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
    //     // to re-login
    //     MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
    //       confirmButtonText: 'Re-Login',
    //       cancelButtonText: 'Cancel',
    //       type: 'warning'
    //     }).then(() => {
    //       store.dispatch('user/resetToken').then(() => {
    //         location.reload()
    //       })
    //     })
    //   }
    //   return Promise.reject(new Error(res.message || 'Error'))
    // } else {
    //  }
  },
  (error) => {
    console.log('err' + error) // for debug
    // Message({
    //   message: error.message,
    //   type: 'error',
    //   duration: 5 * 1000
    // })
    return Promise.reject(error).catch(err => {
      console.log(err)
    })
    // return Promise.reject(error)
  }
)
export default service

具体我们看一下拦截器的内容,这里我们每次请求时都给请求设置一个拦截器,拦截器主要判断我们 localStorage.token是否存在,如果存在就给请求设置一个请求头,如果没有token就回到登陆界面,注意请求还是出去了,还是能.then得到结果。


在真实项目中,当路由已经跳转,而上一页的请求还在pending状态,如果数据量小还好,数据量大时,跳到新页面,旧的请求依旧没有停止,这将会十分损耗性能,这时我们应该先取消掉之前还没有获得相应的请求,再跳转页面。所以这里我们用到了CancelToken,通过传递一个 executor 函数到 CancelToken 的构造函数来创建 cancel token,在vuex里写一个全局axiosCancel的空数组,用来装我们的cancel函数,每次请求时都将cancel函数推入的axiosCancel数组。


然后我们在路由守卫里添加一个清空cancel的方法,这样就实现了每次切换页面时都会清空padding状态的请求,减少性能消耗


router.beforeEach((to, from, next) => {
   //中断请求
    store.state.axiosCancel.forEach(item=> {
        item()
  }) 
//清空数组
   store.state.axiosCancel = []
})

封装好请求后,我们新建一个api文件夹,这里存放各种接口,我这里就举两个post和get方法的例子供参考

import request from '@/plugins/axios'
// 根据指定条件数据
export function getUsersByConditions(params) {
    return request({
      url: '/019/user/getUsersByConditions',
      method: 'get',
      params: params
    })
}
// 修改用户数据
export function saveOrUpdateUser(data) {
  return request({
    url: '/019/user/saveOrUpdateUser',
    method: 'post',
   data
  })
}


相关文章
|
18天前
vue3+Ts 二次封装ElementUI form表单
【10月更文挑战第8天】
172 59
|
19天前
|
JavaScript 数据可视化
vue-cli学习一:vue脚手架的 vue-cli2和vue-cli3版本 创建vue项目,vue的初始化详解
这篇文章介绍了如何使用vue-cli 2和3版本来创建Vue项目,并详细说明了两者之间的主要区别。
67 5
vue-cli学习一:vue脚手架的 vue-cli2和vue-cli3版本 创建vue项目,vue的初始化详解
|
12天前
|
JavaScript 容器
乾坤qiankun框架搭建 主应用为vue3的项目。
乾坤qiankun框架搭建 主应用为vue3的项目。
96 2
|
2天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
19天前
|
JavaScript 数据可视化
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
这篇文章详细介绍了Vue CLI 3版本创建项目时的Runtime-Compiler和Runtime-only两种模式的区别、Vue程序的运行过程、render函数的使用、eslint的关闭方法,以及Vue CLI 2和3版本配置文件的不同和脚手架3版本创建项目的配置文件配置方法。
27 3
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
|
6天前
|
JavaScript
如何在 Vue 项目中选择合适的模块格式
【10月更文挑战第20天】选择合适的模块格式需要综合考虑多个因素,没有一种绝对正确的选择。需要根据项目的具体情况进行权衡和分析。在实际选择过程中,要保持灵活性,根据项目的发展和变化适时调整模块格式。
15 7
|
1天前
Vue3 项目的 setup 函数
【10月更文挑战第23天】setup` 函数是 Vue3 中非常重要的一个概念,掌握它的使用方法对于开发高效、灵活的 Vue3 组件至关重要。通过不断的实践和探索,你将能够更好地利用 `setup` 函数来构建优秀的 Vue3 项目。
|
6天前
|
JavaScript 前端开发 编译器
在 Vue 项目中使用 ES 模块格式的优点
【10月更文挑战第20天】在 Vue 项目中使用 ES 模块格式具有众多优点,这些优点共同作用,使得项目能够更高效、更可靠地开发和运行。当然,在实际应用中,还需要根据项目的具体情况和需求进行合理的选择和配置。
16 6
|
1天前
|
JavaScript 测试技术 UED
解决 Vue 项目中 Tree shaking 无法去除某些模块
【10月更文挑战第23天】解决 Vue 项目中 Tree shaking 无法去除某些模块的问题需要综合考虑多种因素,通过仔细分析、排查和优化,逐步提高 Tree shaking 的效果,为项目带来更好的性能和用户体验。同时,持续关注和学习相关技术的发展,不断探索新的解决方案,以适应不断变化的项目需求。
|
11天前
|
缓存 JavaScript 前端开发
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
46 3