浅谈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 相关文章推荐
jQuery autocomplete插件修改
Apr 17 Javascript
JavaScript Timer实现代码
Feb 17 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
Oct 11 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
Jun 26 Javascript
flag和jq on 的绑定多个对象和方法(必看)
Feb 27 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
Jul 17 Javascript
vue如何获取点击事件源的方法
Aug 10 Javascript
基于javascript中的typeof和类型判断(详解)
Oct 27 Javascript
vue组件父子间通信之综合练习(聊天室)
Nov 07 Javascript
解决vue-router进行build无法正常显示路由页面的问题
Mar 06 Javascript
ES6对象操作实例详解
May 23 Javascript
JavaScript canvas实现雨滴特效
Jan 10 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学习笔记之面向对象编程
2012/12/29 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
JavaScript的parseInt 取整使用
2011/05/09 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
2014/05/05 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
详解Python中for循环是如何工作的
2017/06/30 Python
Python实现的rsa加密算法详解
2018/01/24 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
公司市场部岗位职责
2013/12/02 职场文书
聚美优品的广告词
2014/03/14 职场文书
学习保证书范文
2014/04/30 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
妇联主席先进事迹
2014/05/18 职场文书
求职教师自荐书
2014/06/19 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
课堂打架检讨书200字
2014/11/21 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫