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基础知识大全 便于大家学习,也便于我自己查看
Aug 17 Javascript
js控制CSS样式属性语法对照表
Dec 11 Javascript
JS检测输入字符是否包含非法字符的示例代码
Feb 11 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
Sep 16 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
Oct 29 Javascript
jQuery中cookie插件用法实例分析
Dec 04 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
Nov 09 Javascript
JS库之Particles.js中文开发手册及参数详解
Sep 13 Javascript
JS 使用 window对象的print方法实现分页打印功能
May 16 Javascript
使用Vue 自定义文件选择器组件的实例代码
Mar 04 Javascript
Vue自定义铃声提示音组件的实现
Jan 22 Vue.js
vue实现省市区联动 element-china-area-data插件
Apr 22 Vue.js
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
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
如何离线执行php任务
2017/02/21 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
jquery实现简单手风琴菜单效果实例
2015/06/13 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
JS装饰器函数用法总结
2018/04/21 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
判断js数据类型的函数实例详解
2019/05/23 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
python基础之入门必看操作
2017/07/26 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
python3.4爬虫demo
2019/01/22 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
一些PHP的面试题
2015/05/06 面试题
教育科学研究生自荐信
2013/10/09 职场文书
个人求职简历的自我评价范文
2013/10/09 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
团队拓展训练心得体会
2016/01/12 职场文书