浅谈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 相关文章推荐
判断iframe是否加载完成的完美方法
Jan 07 Javascript
利用javascript的面向对象的特性实现限制试用期
Aug 04 Javascript
JQuery实现用户名无刷新验证的小例子
Mar 22 Javascript
Javascript优化技巧之短路表达式详细介绍
Mar 27 Javascript
JavaScript为事件句柄绑定监听函数实例详解
Dec 15 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
Feb 17 Javascript
Vue.js基础知识汇总
Apr 27 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
Aug 26 Javascript
Vue.js事件处理器与表单控件绑定详解
Mar 20 Javascript
浅谈Angular路由复用策略
Oct 04 Javascript
JavaScript中while循环的基础使用教程
Aug 11 Javascript
Node.JS如何实现JWT原理
Sep 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
Phpbean路由转发的php代码
2008/01/10 PHP
PHP中使用正则表达式提取中文实现笔记
2015/01/20 PHP
php实现的验证码文件类实例
2015/06/18 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
Javascript面向对象编程
2012/03/18 Javascript
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
js showModalDialog参数的使用详解
2014/01/07 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
python图形开发GUI库wxpython使用方法详解
2020/02/14 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
Django之腾讯云短信的实现
2020/06/12 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
开学季活动策划方案
2014/02/28 职场文书
党章培训心得体会
2014/09/04 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
企业愿景口号
2015/12/25 职场文书
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技