vue+axios 拦截器实现统一token的案例


Posted in Javascript onSeptember 11, 2020

需求

要想统一处理所有http请求和响应,就得用上 axios 的拦截器。通过配置 http response inteceptor ,当后端接口返回 401 Unauthorized(未授权) ,让用户重新登录。

通过这个项目学习如何实现一个前端项目中所需要的 登录及拦截、登出、token失效的拦截及对应 axios 拦截器的使用。

代码如下:

const instance = axios.create({
 baseURL: 'http://www.laravel5.5.com/api/',
 timeout: 10000,
});

//POST传参序列化(添加请求拦截器)
// 在发送请求之前做某件事
instance.interceptors.request.use(config => {
//  // 设置以 form 表单的形式提交参数,如果以 JSON 的形式提交表单,可忽略
 if(config.method === 'post'){
  // JSON 转换为 FormData
  const formData = new FormData();
  Object.keys(config.data).forEach(key => formData.append(key, config.data[key]))
  config.data = formData
 }
 // 下面会说在什么时候存储 token
 if (localStorage.token) {
  config.headers['Authorization'] = localStorage.token;
  config.headers['Accept'] = 'application/json';
  // config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
  // store.dispatch('logined', localStorage.token)
 }
 return config
},error =>{
 alert("错误的传参", 'fail')
 return Promise.reject(error)
})

// 自定义的 axios 响应拦截器
instance.interceptors.response.use((response) => {
 // 判断一下响应中是否有 token,如果有就直接使用此 token 替换掉本地的 token。你可以根据你的业务需求自己编写更新 token 的逻辑
 var token = response.headers.authorization;

 if (token) {
  // 如果 header 中存在 token,那么触发 refreshToken 方法,替换本地的 token
  axios.defaults.headers.common['Authorization'] = token;
 }
 return response
}, (error) => {
 if (error.response) {
  switch (error.response.status) {
   case 401:
    // 这里写清除token的代码
    router.replace({
     path: 'login',
     query: {redirect: router.currentRoute.fullPath}//登录成功后跳入浏览的当前页面
    })
  }
 }
 return Promise.reject(error)
});
Vue.http = Vue.prototype.$http = instance;

简单的分享一下自己的代码;这是本人结合JWT-Auth定制的axios拦截,

1.根据用户是否登陆,查看用户请求头是否携带token

2.根据判断后台响应值headers是否携带Authorization值,如果存在,刷新Token

3.如果用户授权失败,直接跳至登陆页面

补充知识:vue封装axios(统一添加请求参数,如token useId等)

main.js中:

import axios from 'axios'
import VueAxios from 'vue-axios'
import qs from 'qs';
Vue.prototype.$qs = qs;
 
//请求的拦截器
/*axios.defaults.transformRequest=[function(data){
 return qs.stringify(data);
}];*/
axios.interceptors.request.use(function(config){
 const cl_u_id=localStorage.getItem('cl_u_id');
 const appId=localStorage.getItem('appId');
 
 if(config.headers['Content-Type'] == 'multipart/form-data'){
  config.data.set('cl_u_id',cl_u_id);
  config.data.set('appId',appId);
  return config;
 }
 //判断请求的类型:如果是post请求就把默认参数拼到data里面;如果是get请求就拼到params里面
 if(config.method==='post'){
  config.data=qs.stringify({
   cl_u_id:cl_u_id,
   appId:appId,
   ...config.data
  })
 }else if(config.method==='get'){
  config.params={
   cl_u_id:cl_u_id,
   appId:appId,
   ...config.params
  }
 }
 return config;
},function(error){
 return Promise.reject(error);
}) 
Vue.use(VueAxios, axios)

vue+axios 拦截器实现统一token的案例

以上这篇vue+axios 拦截器实现统一token的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中负数算术右移、逻辑右移的奥秘探索
Oct 17 Javascript
js读取被点击次数的简单实例(从数据库中读取)
Mar 07 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
Oct 16 Javascript
果断收藏9个Javascript代码高亮脚本
Jan 06 Javascript
AngularJs实现分页功能不带省略号的代码
May 30 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
Jul 01 Javascript
AngularJS实现标签页的两种方式
Sep 05 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
Sep 20 Javascript
[原创]jquery判断元素内容是否为空的方法
May 04 jQuery
js如何获取图片url的Blob值并预览示例代码
Mar 07 Javascript
基于Web Audio API实现音频可视化效果
Jun 12 Javascript
HTML元素拖拽功能实现的完整实例
Dec 04 Javascript
Vue axios获取token临时令牌封装案例
Sep 11 #Javascript
Vue-cli4 配置 element-ui 按需引入操作
Sep 11 #Javascript
vue 子组件和父组件传值的示例
Sep 11 #Javascript
jQuery实现朋友圈查看图片
Sep 11 #jQuery
详解webpack的文件监听实现(热更新)
Sep 11 #Javascript
js代码编写无缝轮播图
Sep 13 #Javascript
vue-cli脚手架的.babelrc文件用法说明
Sep 11 #Javascript
You might like
php缩小png图片不损失透明色的解决方法
2013/12/25 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
jQuery提交多个表单的小例子
2013/06/30 Javascript
Jquery实现显示和隐藏的4种简单方式
2013/08/28 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
JavaScript数据类型之基本类型和引用类型的值
2015/04/01 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
python 移除字符串尾部的数字方法
2018/07/17 Python
【python】matplotlib动态显示详解
2019/04/11 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
优秀学生获奖感言
2014/02/15 职场文书
服装设计专业自荐信
2014/06/17 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
第一节英语课开场白
2015/06/01 职场文书
出生证明范本
2015/06/15 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js