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
  })
}


相关文章
|
10天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
13天前
|
JavaScript
如何在 Vue 项目中选择合适的模块格式
【10月更文挑战第20天】选择合适的模块格式需要综合考虑多个因素,没有一种绝对正确的选择。需要根据项目的具体情况进行权衡和分析。在实际选择过程中,要保持灵活性,根据项目的发展和变化适时调整模块格式。
17 7
|
9天前
Vue3 项目的 setup 函数
【10月更文挑战第23天】setup` 函数是 Vue3 中非常重要的一个概念,掌握它的使用方法对于开发高效、灵活的 Vue3 组件至关重要。通过不断的实践和探索,你将能够更好地利用 `setup` 函数来构建优秀的 Vue3 项目。
|
13天前
|
JavaScript 前端开发 编译器
在 Vue 项目中使用 ES 模块格式的优点
【10月更文挑战第20天】在 Vue 项目中使用 ES 模块格式具有众多优点,这些优点共同作用,使得项目能够更高效、更可靠地开发和运行。当然,在实际应用中,还需要根据项目的具体情况和需求进行合理的选择和配置。
22 6
|
9天前
|
JavaScript 测试技术 UED
解决 Vue 项目中 Tree shaking 无法去除某些模块
【10月更文挑战第23天】解决 Vue 项目中 Tree shaking 无法去除某些模块的问题需要综合考虑多种因素,通过仔细分析、排查和优化,逐步提高 Tree shaking 的效果,为项目带来更好的性能和用户体验。同时,持续关注和学习相关技术的发展,不断探索新的解决方案,以适应不断变化的项目需求。
|
18天前
|
缓存 JavaScript 前端开发
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
62 3
|
17天前
|
JavaScript 前端开发 Java
vue2知识点:Vue封装的过度与动画
vue2知识点:Vue封装的过度与动画
14 0
|
3天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
3天前
|
存储 JavaScript
Vue 状态管理工具vuex
Vue 状态管理工具vuex
|
10天前
|
缓存 JavaScript 搜索推荐
Vue SSR(服务端渲染)预渲染的工作原理
【10月更文挑战第23天】Vue SSR 预渲染通过一系列复杂的步骤和机制,实现了在服务器端生成静态 HTML 页面的目标。它为提升 Vue 应用的性能、SEO 效果以及用户体验提供了有力的支持。随着技术的不断发展,Vue SSR 预渲染技术也将不断完善和创新,以适应不断变化的互联网环境和用户需求。
29 9