axios 处理 302 状态码的解决方法


Posted in Javascript onApril 10, 2018

比如说浏览器打开了一个单页面(SPA)应用,过了一段时间token(或者session)过期了,这个时候页面上发起 Ajax请求之后,后端返回302状态码跳转到login页面。 我这是使用的是 Vue + axios ,发现 axios 无法拦截到 302请求,下面是处理的过程。

思考

google axios 302 handle 看到 axios github 上的两个讨论

•  https://github.com/axios/axios/issues/932

•  https://github.com/axios/axios/issues/980

得到的结论就是:浏览器发送的ajax请求,服务端返回了302状态码,浏览器会自行跳转,我们无法通过 js 库(jquery, axios) 直接得到并自定义处理流程,只能等到浏览器重定向之后的url获取相应信息。

axios 发送ajax -->
server 返回302和location -->
浏览器请求新的url -->
服务端返回200 -->

axios 获取结果

那么怎么解决呢?需要服务端配合解决

Brower (ajax and not auth) -->
server判断是ajax请求,未登陆,返回 401状态码 -->
浏览器 axios 拦截401,并且通过js 跳转到 /login

解决

浏览器端, axios 增加拦截器

axios.interceptors.response.use((response) => {
  return response;
}, function (error) {
  if (401 === error.response.status) {
    window.location = '/login';
  } else {
    return Promise.reject(error);
  }
});
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

后端代码,使用flask框架,看个流程就行,验证请求是否是 ajax 和 未登陆,然后返回401状态码

from flask import Blueprint, request, jsonify, make_response, abort
from flask_login.utils import current_user, current_app
apibp = Blueprint('api', 'api_bp')
# 主要逻辑
def bp_login_required():
  if not current_user.is_authenticated:
    if request.is_xhr:
      abort(401)
    else:
      return current_app.login_manager.unauthorized()
apibp.before_request(bp_login_required)
@apibp.route("/report/domains/<month>/", methods=["GET"])
def monthly_domains(month):
  return jsonify({})
ref

•   https://github.com/axios/axios/issues/690

总结

以上所述是小编给大家介绍axios 处理 302 状态码的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Kibo 用于处理键盘事件的Javascript工具库
Oct 28 Javascript
javascript阻止scroll事件多次执行的思路及实现
Nov 08 Javascript
javaScript中的this示例学习详解及工作原理
Jan 13 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
Jun 30 Javascript
老生常谈JQuery data方法的使用
Sep 09 Javascript
Javascript中this绑定的3种方法与比较
Oct 13 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
Mar 01 Javascript
jQuery选择器之表单元素选择器详解
Sep 19 jQuery
this在vue和小程序中的使用详解
Jan 28 Javascript
js实现消灭星星(web简易版)
Mar 24 Javascript
Vue是怎么渲染template内的标签内容的
Jun 05 Javascript
绘制微信小程序验证码功能的实例代码
Jan 05 Javascript
vue.js中npm安装教程图解
Apr 10 #Javascript
vue实现验证码按钮倒计时功能
Apr 10 #Javascript
vue 微信授权登录解决方案
Apr 10 #Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
Apr 10 #Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
Apr 10 #Javascript
Angular CLI在Angular项目中如何使用scss详解
Apr 10 #Javascript
vue2.0+koa2+mongodb实现注册登录
Apr 10 #Javascript
You might like
解析argc argv在php中的应用
2013/06/24 PHP
PHP函数实现分页含文本分页和数字分页
2014/10/23 PHP
PHP解决中文乱码
2017/04/28 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
2013/07/02 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
js获取视频时长代码
2014/04/10 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
Angular通过指令动态添加组件问题
2018/07/09 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
2020/07/21 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
部队领导证婚词
2014/01/12 职场文书
农村门前三包责任书
2014/07/25 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
党校学习个人总结
2015/02/15 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
如何利用js在两个html窗口间通信
2021/04/27 Javascript
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript