浅谈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 学习书 推荐
Jun 13 Javascript
js螺旋动画效果的具体实例
Nov 15 Javascript
js获取日期:昨天今天和明天、后天
Jun 11 Javascript
Juery解决tablesorter中文排序和字符范围的方法
May 06 Javascript
Jquery组件easyUi实现选项卡切换示例
Aug 23 Javascript
jQuery-mobile事件监听与用法详解
Nov 23 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
Apr 04 jQuery
Vue二次封装axios为插件使用详解
May 21 Javascript
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
微信小程序实现选择地址省市区三级联动
Jun 21 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
Nov 03 Javascript
ElementUI实现el-form表单重置功能按钮
Jul 21 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阻止页面后退的方法分享
2014/02/17 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
php源码之将图片转化为data/base64数据流实例详解
2016/11/27 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
PHP多维数组排序array详解
2017/11/21 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
javascript 鼠标滚轮事件
2009/04/09 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
2012/11/07 Javascript
使用jquery.qrcode生成彩色二维码实例
2014/08/08 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
Tesserocr库的正确安装方式
2018/10/19 Python
python快排算法详解
2019/03/04 Python
Django框架表单操作实例分析
2019/11/04 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
一道SQL存储过程面试题
2016/10/07 面试题
国家励志奖学金获奖感言
2014/01/09 职场文书
新护士岗前培训制度
2014/02/02 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
岳麓书院导游词
2015/02/03 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书