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 相关文章推荐
在js(jquery)中获得文本框焦点和失去焦点的方法
Dec 04 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
May 19 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
Apr 01 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
Jan 22 Javascript
jQuery实现立体式数字滚动条增加效果
Dec 21 Javascript
AngularJs 利用百度地图API 定位当前位置 获取地址信息
Jan 18 Javascript
Bootstrap fileinput组件封装及使用详解
Mar 10 Javascript
原生js实现简单的Ripple按钮实例代码
Mar 24 Javascript
Vue+mui实现图片的本地缓存示例代码
May 24 Javascript
JavaScript日期工具类DateUtils定义与用法示例
Sep 03 Javascript
layer.alert回调函数执行关闭弹窗的实例
Sep 11 Javascript
分享几个JavaScript运算符的使用技巧
Apr 24 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
一些星际专用术语解释
2020/03/04 星际争霸
php你的验证码安全码?
2007/01/02 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
为javascript添加String.Format方法
2020/08/11 Javascript
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
python转换摩斯密码示例
2014/02/16 Python
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
python list格式数据excel导出方法
2018/10/31 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
Django后台admin的使用详解
2019/07/08 Python
python实现串口通信的示例代码
2020/02/10 Python
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
会计岗位职责模板
2014/03/12 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
会议主持人开场白台词
2015/05/28 职场文书
辩论会主持词
2015/07/03 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
vue3中provide && inject的使用
2021/07/01 Vue.js
Nginx配置https的实现
2021/11/27 Servers