浅谈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 相关文章推荐
JavaScript 无符号右移赋值操作
Apr 17 Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
Oct 24 Javascript
使用JQUERY Tabs插件宿主IFRAMES
Jan 01 Javascript
jquery ajax 同步异步的执行示例代码
Jun 23 Javascript
ECMAScript5(ES5)中bind方法使用小结
May 07 Javascript
js+html5实现canvas绘制简单矩形的方法
Jun 05 Javascript
JavaScript数组方法大全(推荐)
Jul 05 Javascript
easy ui datagrid 从编辑框中获取值的方法
Feb 22 Javascript
微信小程序实现发红包功能
Jul 11 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
Aug 09 Javascript
微信小程序引用iconfont图标的方法
Oct 22 Javascript
vue微信分享插件使用方法详解
Feb 18 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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
php中chdir()函数用法实例
2014/11/13 PHP
php数组去除空值函数分享
2015/02/02 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
详解Nodejs 通过 fs.createWriteStream 保存文件
2017/10/10 NodeJs
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
Vue SPA 首屏优化方案
2021/02/26 Vue.js
python采集博客中上传的QQ截图文件
2014/07/18 Python
python中的reduce内建函数使用方法指南
2014/08/31 Python
Python字符串处理函数简明总结
2015/04/13 Python
Python selenium 三种等待方式解读
2016/09/15 Python
基于MATLAB和Python实现MFCC特征参数提取
2019/08/13 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
社区八一活动方案
2014/02/03 职场文书
六月份红领巾广播稿
2014/02/03 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
工作简报格式范文
2015/07/21 职场文书
用python画城市轮播地图
2021/05/28 Python
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技