這次帶給大家axios中的302狀態碼,使用axios中302狀態碼的注意事項有哪些,下面就是實戰案例,一起來看一下。
比如說瀏覽器開啟了一個單一頁面(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 -->
axios 取得結果
瀏覽器請求新的url -->
服務端回傳200 -- >
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相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章! 推薦閱讀:
以上是axios中的302狀態碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!