浅谈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弹簧振子超简洁版 完全符合能量守恒,胡克定理
Oct 25 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
May 07 Javascript
浅析javascript中function 的 length 属性
May 27 Javascript
使用jquery动态加载js文件的方法
Dec 24 Javascript
jQuery实现下滑菜单导航效果代码
Aug 25 Javascript
javascript日期操作详解(脚本之家整理)
Sep 05 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
Sep 17 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
Feb 27 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
移动前端图片压缩上传的实例
Dec 06 Javascript
Layui Table js 模拟选中checkbox的例子
Sep 03 Javascript
vue基础知识--axios合并请求和slot
Jun 04 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 autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
2016/12/21 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
如何运行Python程序的方法
2013/04/21 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
在python中安装basemap的教程
2018/09/20 Python
Python帮你识破双11的套路
2019/11/11 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
毕业生就业自荐信
2013/12/04 职场文书
电厂厂长岗位职责
2014/01/02 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
运动会通讯稿50字
2015/07/20 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript
使用MybatisPlus打印sql语句
2022/04/22 SQL Server