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 String 的扩展方法集合
Jun 01 Javascript
Javascript 面向对象特性
Dec 28 Javascript
jquery tab标签页的制作
May 10 Javascript
js格式化时间小结
Nov 03 Javascript
推荐10 个很棒的 jQuery 特效代码
Oct 04 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
Dec 27 Javascript
js, jQuery实现全选、反选功能
Mar 08 Javascript
浅谈Express异步进化史
Sep 09 Javascript
原生javascript实现文件异步上传的实例讲解
Oct 26 Javascript
JS高级技巧(简洁版)
Jul 29 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
Sep 18 Javascript
使用vuepress搭建静态博客的示例代码
Feb 14 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代码技巧的小结
2013/06/02 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
js 提交和设置表单的值
2008/12/19 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
javascript 数组操作详解
2015/01/29 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
python装饰器初探(推荐)
2016/07/21 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
Python unittest单元测试框架总结
2018/09/08 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
Django logging配置及使用详解
2019/07/23 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
python 图像增强算法实现详解
2021/01/24 Python
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
车间机修工岗位职责
2014/02/28 职场文书
门市房租房协议书
2014/12/04 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
安全学习心得体会范文
2016/01/18 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书