axios 处理 302 状态码的解决方法

axios 处理 302 状态码的解决方法

本文主要介绍了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状态码的解决方案。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!

axios 处理 302 状态码的解决方法