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 相关文章推荐
20个非常棒的Jquery实用工具 国外文章
Jan 01 Javascript
JQuery打造省市下拉框联动效果
May 18 Javascript
js+cookies实现悬浮购物车的方法
May 25 Javascript
跟我学习javascript的全局变量
Nov 16 Javascript
Bootstrap表单布局
Jul 19 Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
vue如何在自定义组件中使用v-model
May 14 Javascript
微信小程序实现红包雨功能
Jul 11 Javascript
OpenLayers加载缩放控件使用方法详解
Sep 25 Javascript
原生小程序封装跑马灯效果
Oct 21 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
Mar 01 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
咖啡冲泡指南 咖啡有哪些制作方式 单品咖啡 意式咖啡
2021/03/06 冲泡冲煮
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
PHP之header函数详解
2021/03/02 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
JS实现单击输入框弹出选择框效果完整实例
2015/12/14 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
python万年历实现代码 含运行结果
2017/05/20 Python
Python单例模式的两种实现方法
2017/08/14 Python
详解python中的index函数用法
2019/08/06 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
什么是属性访问器
2015/10/26 面试题
校园环保建议书
2014/05/14 职场文书
品牌推广策划方案
2014/05/28 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
简爱读书笔记
2015/06/26 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript