首頁 >web前端 >js教程 >axios中的302狀態碼

axios中的302狀態碼

php中世界最好的语言
php中世界最好的语言原創
2018-06-08 17:30:472941瀏覽

這次帶給大家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 -->
瀏覽器請求新的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, 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中文網其它相關文章!

推薦閱讀:

如何使用vue請求本機json

#JS操作JSON陣列去重

以上是axios中的302狀態碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn