比如說瀏覽器打開了一個單頁面(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, abortfrom flask_login.utils import current_user, current_appapibp = 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 狀態碼的解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!
新聞熱點
疑難解答