浅谈Vue网络请求之interceptors实际应用


Posted in Javascript onFebruary 28, 2018

项目背景

最近在项目开发中,遇到下面这样一个问题:

  1. 在进行铭感操作之前,每个请求需要携带token,但是token 有有效期,token 失效后需要换取新的token并继续请求。

需求分析

  1. 每个请求都需要携带 token ,所以我们可以使用 axios request 拦截器,在这里,我们给每个请求都加 token,这样就可以节省每个请求再一次次的复制粘贴代码。
  2. token 失效问题,当我们token 失效,我们服务端会返回一个特定的错误表示,比如 token invalid,但是我们不能在每个请求之后去做刷新 token 的操作呀,所以这里我们就用 axios response 拦截器,我们统一处理所有请求成功之后响应过来的数据,然后对特殊数据进行处理,其他的正常分发。

功能实现

分析完问题后,我们来实现功能

安装axios, 这里我们就赘述怎么安装axios.

在 main.js 注册 axios

Vue.use(Vuex)
Vue.use(VueAxios, axios)
Vue.use(qs)

注:qs,使用axios,必须得安装 qs,所有的Post 请求,我们都需要 qs,对参数进行序列化。

在 request 拦截器实现

axios.interceptors.request.use(
 config => {
  config.baseURL = '/api/'
  config.withCredentials = true // 允许携带token ,这个是解决跨域产生的相关问题
  config.timeout = 2500
  let token = sessionStorage.getItem('access_token')
  let csrf = store.getters.csrf
  if (token) {
   config.headers = {
    'access-token': token,
    'Content-Type': 'application/x-www-form-urlencoded'
   }
  }
  if (config.url === 'refresh') {
   config.headers = {
    'refresh-token': sessionStorage.getItem('refresh_token'),
    'Content-Type': 'application/x-www-form-urlencoded'
   }
  }
  return config
 },
 error => {
  return Promise.reject(error)
 }
)

在 response 拦截器实现

axios.interceptors.response.use(
 response => {
  // 定时刷新access-token
  if (!response.data.value && response.data.data.message === 'token invalid') {
   // 刷新token
   store.dispatch('refresh').then(response => {
    sessionStorage.setItem('access_token', response.data)
   }).catch(error => {
    throw new Error('token刷新' + error)
   })
  }
  return response
 },
 error => {
  return Promise.reject(error)
 }
)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js模拟实现Array的sort方法
Dec 11 Javascript
javascript返回顶部效果(自写代码)
Jan 06 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
Mar 18 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
Aug 08 Javascript
浏览器缩放检测的js代码
Sep 28 Javascript
DOM 事件流详解
Jan 20 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
JS遍历数组及打印数组实例分析
Jan 21 Javascript
axios取消请求的实践记录分享
Sep 26 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
Jul 22 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
Sep 04 Javascript
js 实现Material UI点击涟漪效果示例
Sep 23 Javascript
Node.js中DNS模块学习总结
Feb 28 #Javascript
Vue自定义指令实现checkbox全选功能的方法
Feb 28 #Javascript
如何在vue中使用ts的示例代码
Feb 28 #Javascript
angularjs select 赋值 ng-options配置方法
Feb 28 #Javascript
select获取下拉框的值 下拉框默认选中方法
Feb 28 #Javascript
AngularJS select加载数据选中默认值的方法
Feb 28 #Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
Feb 28 #Javascript
You might like
让PHP开发者事半功倍的十大技巧小结
2010/04/20 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
JavaScript 无符号右移运算符
2009/04/17 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
Javascript中的变量使用说明
2010/05/18 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
2016/06/12 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
python实现保存网页到本地示例
2014/03/16 Python
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
初步解析Python中的yield函数的用法
2015/04/03 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
使用TFRecord存取多个数据案例
2020/02/17 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
南威尔士家居商店:Leekes
2016/10/25 全球购物
平民服装店创业计划书
2014/01/17 职场文书
班风口号
2014/06/18 职场文书
2014年妇委会工作总结
2014/12/10 职场文书