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 相关文章推荐
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 Javascript
js 动态文字滚动的例子
Jan 17 Javascript
自己做的模拟模态对话框实现代码
May 23 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
Nov 25 Javascript
JS动态添加与删除select中的Option对象(示例代码)
Dec 25 Javascript
自编jQuery插件实现模拟alert和confirm
Sep 01 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
May 09 Javascript
详解JavaScript中的事件流和事件处理程序
May 20 Javascript
Webpack path与publicPath的区别详解
May 03 Javascript
微信小程序关键字变色实现代码实例
Dec 13 Javascript
微信小程序scroll-view的滚动条设置实现
Mar 02 Javascript
JavaScript实现班级抽签小程序
May 19 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 array_slice函数的使用以及参数详解
2008/08/30 PHP
php版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
php生成随机颜色方法汇总
2014/12/03 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
TensorFlow平台下Python实现神经网络
2018/03/10 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
留学推荐信中文范文三篇
2014/01/25 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
认错检讨书
2014/10/02 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书