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 相关文章推荐
jquery autocomplete自动完成插件的的使用方法
Aug 07 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
Dec 09 Javascript
jQuery中append()方法用法实例
Jan 08 Javascript
JavaScript中的依赖注入详解
Mar 18 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
May 11 Javascript
javascript实现数组中的内容随机输出
Aug 11 Javascript
JavaScript验证Email(3种方法)
Sep 21 Javascript
jQuery插件开发汇总
May 15 Javascript
JS获得一个对象的所有属性和方法实例
Feb 21 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
Apr 13 Javascript
Bootstrap实现可折叠分组侧边导航菜单
Mar 07 Javascript
javascript中的with语句学习笔记及用法
Feb 17 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网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
PHP网站开发中常用的8个小技巧
2015/02/13 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
基于jQuery的的一个隔行变色,鼠标移动变色的小插件
2010/07/06 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
2010/11/25 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
javascript动画浅析
2012/08/30 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
vue v-for直接循环数字实例
2019/11/07 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
python3中int(整型)的使用教程
2017/03/23 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
通过代码实例了解Python sys模块
2020/09/14 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
村安全生产责任书
2014/08/25 职场文书
学生检讨书如何写
2014/10/30 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
研究生简历自我评
2015/03/11 职场文书
安全教育第一课观后感
2015/06/17 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers