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 相关文章推荐
JavaScript 实现简单的倒计时弹窗DEMO附图
Mar 05 Javascript
JavaScript中用字面量创建对象介绍
Dec 31 Javascript
JQuery实现网页右侧随动广告特效
Jan 17 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
Jan 19 Javascript
仅30行代码实现Javascript中的MVC
Feb 15 Javascript
jQuery 常用代码集锦(必看篇)
May 16 Javascript
Vue.js学习之过滤器详解
Jan 22 Javascript
jQuery图片缩放插件smartZoom使用实例详解
Aug 25 jQuery
基于zepto.js实现登录界面
Oct 09 Javascript
vue中的计算属性实例详解
Sep 19 Javascript
详解JSON和JSONP劫持以及解决方法
Mar 08 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
Apr 11 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
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
input file获得文件根目录简单实现
2013/04/26 PHP
php中opendir函数用法实例
2014/11/15 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
javascript中数组的常用算法深入分析
2019/03/12 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
Python实现从url中提取域名的几种方法
2014/09/26 Python
Python模块包中__init__.py文件功能分析
2016/06/14 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
Python使用Matlab命令过程解析
2020/06/04 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
New Balance美国官网:运动鞋和健身服装
2017/04/11 全球购物
文秘专业大学生求职信
2013/11/10 职场文书
旷课检讨书大全
2014/01/21 职场文书
端午节粽子促销活动方案
2014/02/02 职场文书
学生安全责任书范本
2014/07/24 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
中秋节寄语2015
2015/03/24 职场文书
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python