浅谈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 相关文章推荐
ASP中Sub和Function的区别说明
Aug 30 Javascript
固定背景实现的背景滚动特效示例分享
May 19 Javascript
jQuery中removeProp()方法用法实例
Jan 05 Javascript
JavaScript仿支付宝密码输入框
Dec 29 Javascript
JavaScript实现身份证验证代码
Feb 17 Javascript
Easyui Treegrid改变默认图标的方法
Apr 29 Javascript
JavaScript实现窗口抖动效果
Oct 19 Javascript
浅谈AngularJs指令之scope属性详解
Oct 24 Javascript
手机端js和html5刮刮卡效果
Sep 29 Javascript
JavaScript实现前端分页控件
Apr 19 Javascript
javascript实现抢购倒计时程序
Aug 26 Javascript
uniapp微信小程序实现一个页面多个倒计时
Nov 01 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中如何防止表单的重复提交
2013/08/02 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
javascript 表单验证常见正则
2009/09/28 Javascript
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
js实现楼层导航功能
2017/02/23 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
微信小程序 简易计算器实现代码实例
2019/09/02 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
python如何为被装饰的函数保留元数据
2018/03/21 Python
Python 读写文件的操作代码
2018/09/20 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
法律工作求职自荐信
2013/10/31 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
幼儿园安全生产月活动总结
2014/07/05 职场文书
自我查摆剖析材料
2014/10/11 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
三下乡活动心得体会
2016/01/23 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL