本文主要介绍了axios处理302状态码的解决方案,很不错,有参考价值。有需要的朋友可以参考一下。
例如,浏览器打开单页(SPA)应用程序,一段时间后,令牌(或会话)过期。此时,在页面上发起Ajax请求后,后端返回302状态代码,并跳转到登录页面。我在用Vue axios,发现axios无法拦截302请求。流程是这样的。
思考
谷歌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 -
服务器302和位置-
浏览器请求一个新的url -
服务器返回200-
Axios获得结果
那么如何解决呢?需要服务器端合作解决。
浏览器(ajax而非auth)
服务器被判断为ajax请求,但没有登录,返回401状态码-
浏览器axios拦截401,通过js跳转/登录。
解决
浏览器方面,axios增加了拦截器。
axios . interceptors . response . use((response)={
返回响应;
},函数(错误){
if(401===error . response . status){
window . location=/log in ;
}否则{
return Promise.reject(错误);
}
});
axios . defaults . headers . common[ X-Requested-With ]= XMLHttpRequest ;
后端代码,用flask框架,只看流程,验证请求是不是ajax没有登录,然后返回401状态码。
从flask导入蓝图,请求,jsonify,make_response,中止
从flask_login.utils导入当前用户,当前应用程序
apibp=Blueprint(api , api_bp )
#主逻辑
def bp_login_required():
如果不是当前用户,则:
if request.is_xhr:
中止(401)
否则:
return current _ app . log in _ manager . unauthorized()
API BP . before _ request(BP _ log in _ required)
@ API BP . route(/report/domains/month/,methods=[GET])
每月定义_域(月):
返回jsonify({})
裁判员
https://github.com/axios/axios/issues/690
总结
以上是边肖对axios处理302状态码的解决方案。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!