axios 處理 302 狀態(tài)碼的解決方法
比如說(shuō)瀏覽器打開(kāi)了一個(gè)單頁(yè)面(SPA)應(yīng)用,過(guò)了一段時(shí)間token(或者session)過(guò)期了,這個(gè)時(shí)候頁(yè)面上發(fā)起 Ajax請(qǐng)求之后,后端返回302狀態(tài)碼跳轉(zhuǎn)到login頁(yè)面。 我這是使用的是 Vue + axios ,發(fā)現(xiàn) axios 無(wú)法攔截到 302請(qǐng)求,下面是處理的過(guò)程。
思考
google axios 302 handle 看到 axios github 上的兩個(gè)討論
• https://github.com/axios/axios/issues/932
• https://github.com/axios/axios/issues/980
得到的結(jié)論就是:瀏覽器發(fā)送的ajax請(qǐng)求,服務(wù)端返回了302狀態(tài)碼,瀏覽器會(huì)自行跳轉(zhuǎn),我們無(wú)法通過(guò) js 庫(kù)(jquery, axios) 直接得到并自定義處理流程,只能等到瀏覽器重定向之后的url獲取相應(yīng)信息。
axios 發(fā)送ajax -->
server 返回302和location -->
瀏覽器請(qǐng)求新的url -->
服務(wù)端返回200 -->axios 獲取結(jié)果
那么怎么解決呢?需要服務(wù)端配合解決
Brower (ajax and not auth) -->
server判斷是ajax請(qǐng)求,未登陸,返回 401狀態(tài)碼 -->
瀏覽器 axios 攔截401,并且通過(guò)js 跳轉(zhuǎn)到 /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框架,看個(gè)流程就行,驗(yàn)證請(qǐng)求是否是 ajax 和 未登陸,然后返回401狀態(tài)碼
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
總結(jié)
以上所述是小編給大家介紹axios 處理 302 狀態(tài)碼的解決方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
微信小程序進(jìn)入廣告實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了微信小程序進(jìn)入廣告實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09復(fù)制Input內(nèi)容的js代碼_支持所有瀏覽器,修正了Firefox3.5以上的問(wèn)題
今天作一個(gè)功能,有一個(gè)input,里邊有內(nèi)容,點(diǎn)一下按鈕就復(fù)制里邊的內(nèi)容到剪貼板2010-06-06JS數(shù)組array元素的添加和刪除方法代碼實(shí)例
這篇文章主要介紹了JS數(shù)組array元素的添加和刪除方法代碼實(shí)例,本文直接給出操作代碼實(shí)例,需要的朋友可以參考下2015-06-06