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实现 在光标处插入指定内容
May 25 Javascript
这段js代码得节约你多少时间
Dec 20 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
Apr 08 Javascript
Node.js中对通用模块的封装方法
Jun 06 Javascript
8个超实用的jQuery功能代码分享
Jan 08 Javascript
JavaScript对象参数的引用传递
Jan 14 Javascript
jquery popupDialog 使用 加载jsp页面的方法
Oct 25 Javascript
Vue官网todoMVC示例代码
Jan 29 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
Feb 11 Javascript
基于jquery实现左右上下移动效果
May 02 jQuery
vue指令v-html使用过滤器filters功能实例
Oct 25 Javascript
JS控制下拉列表左右选择实例代码
May 08 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
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
2018/03/20 jQuery
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
Python聊天室程序(基础版)
2018/04/01 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
python中的decorator的作用详解
2018/07/26 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
django框架forms组件用法实例详解
2019/12/10 Python
tensorflow的计算图总结
2020/01/12 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
Python实现SMTP邮件发送
2020/06/16 Python
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
党校培训思想汇报
2013/12/30 职场文书
应届大学生简历中的自我评价
2014/01/15 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
IT工程师岗位职责
2014/07/04 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
出差报告格式模板
2014/11/06 职场文书
实习单位意见
2015/06/04 职场文书
2016年父亲节寄语
2015/12/04 职场文书
创业计划书之家政服务
2019/09/18 职场文书
SpringBoot集成Redis的思路详解
2021/10/16 Redis