axios 处理 302 状态码的解决方法
比如说浏览器打开了一个单页面(spa)应用,过了一段时间token(或者session)过期了,这个时候页面上发起 ajax请求之后,后端返回302状态码跳转到login页面。 我这是使用的是 vue + axios ,发现 axios 无法拦截到 302请求,下面是处理的过程。
思考
google axios 302 handle 看到 axios github 上的两个讨论
•
•
得到的结论就是:浏览器发送的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
•
总结
以上所述是小编给大家介绍axios 处理 302 状态码的解决方法,希望对大家有所帮助
上一篇: asp.net SAF 中缓存服务的实现
下一篇: DotNet2.0 生成网站的测试
推荐阅读
-
解决axios发送post请求返回400状态码的问题
-
axios 处理 302 状态码的解决方法
-
IIS下自定义404页面返回200状态码的严重性及解决方法
-
网站404错误页返回200状态码的不利影响及解决方法
-
荐 HTTP状态码301和302的区别详解
-
Ajax语法(Ajax基础、运行原理及实现、异步编程、封装、Ajax状态码、onreadystatechange事件、Ajax错误处理、服务器端响应的数据格式、请求参数)
-
解决axios发送post请求返回400状态码的问题
-
axios 处理 302 状态码的解决方法
-
[Python]网络爬虫(三):异常的处理和HTTP状态码的分类
-
[Python]网络爬虫(三):异常的处理和HTTP状态码的分类