浅谈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 相关文章推荐
css样式标签和js语法属性区别
Nov 06 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
Dec 10 Javascript
jQuery插件实现图片轮播特效
Jun 16 Javascript
用director.js实现前端路由使用实例
Jan 27 Javascript
VUE元素的隐藏和显示(v-show指令)
Jun 23 Javascript
vue2.0 datepicker使用方法
Feb 04 Javascript
浅谈redux以及react-redux简单实现
Aug 28 Javascript
微信小程序实现点赞、取消点赞功能
Nov 02 Javascript
详解关于Vuex的action传入多个参数的问题
Feb 22 Javascript
JS事件绑定的常用方式实例总结
Mar 02 Javascript
JS实现数组删除指定元素功能示例
Jun 05 Javascript
jQuery treeview树形结构应用
Mar 24 jQuery
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
Email+URL的判断和自动转换函数
2006/10/09 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
php实现的递归提成方案实例
2015/11/14 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
全面解析JavaScript中“&&”和“||”操作符(总结篇)
2016/07/18 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
Python找出9个连续的空闲端口
2016/02/01 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
Django数据库表反向生成实例解析
2018/02/06 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
Python存储读取HDF5文件代码解析
2020/11/25 Python
VC++笔试题
2014/10/13 面试题
房地产促销活动方案
2014/03/01 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
个人汇报材料范文
2014/12/30 职场文书
幼儿园中班教师个人工作总结
2015/02/06 职场文书
人与自然的观后感
2015/06/18 职场文书
化验室安全管理制度
2015/08/06 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书