關於vue項目的請求攔截器和響應攔截器


設置請求攔截器和響應攔截器

使用axios// 添加請求攔截器
每個請求體里加上token

axios.interceptors.request.use(
  function (config) {
    // 在發送請求之前做些什么
    return config;
  },
  function (error) {
    // 對請求錯誤做些什么
    return Promise.reject(error);
  }
);

// 添加響應攔截器
//服務器返回登錄狀態失效,需要重新登錄的時候,跳轉到登錄頁
axios.interceptors.response.use(
  function (response) {
    // 對響應數據做點什么
    return response;
  },
  function (error) {
    // 對響應錯誤做點什么
    return Promise.reject(error);
  }
);

在項目中使用的例子

axios.defaults.headers.post["Content-Type"] = "application/json"; //設置請求頭中的媒體類型信息
axios.defaults.baseURL = "http://192.168.2.7:30001/api/v1"; //設置請求不同域名的接口
//http request 請求攔截器,有token值則配置上token值
axios.interceptors.request.use((config) => {
  //在發送請求之前在請求頭中添加token;
  //在頁面登錄的時候先把token設置到sessionStorage(看需求,也可以放在localStorage或者cookie)里面;
  window.sessionStorage.setItem("token", res.data.accessToken);
  config.headers["Authorization"] =
    "Bearer " + window.sessionStorage.getItem("token");
  return config;
}),
  function (error) {
    return Promise.reject(error);
  };

攔截到401的錯誤之后,拿到之前登錄的時候存在sessionStorage里面的refreshToken,用於token過期以后調取刷新token,暫時只做了401的情況,還有很多情況還沒寫

// 響應攔截器
axios.interceptors.response.use(
  (response) => {
    const res = response.data;
    if (res) {
      return response;
    } else {
      return Promise.reject("error");
    }
  },
  (error) => {
    if (error.response.status != 401) {
      router.push({ path: "/login" });
      return;
    }
    //響應為401的情況
    var errorResp = error.response;
    let refreshToken = window.localStorage.getItem("refreshToken");
    if (!refreshToken) {
      router.push({ path: "/login" });
      return;
    }
    return new Promise((resolve, reject) => {
      axios({
        url: `/api/refreshtoken?refreshToken=${refreshToken}`,
        method: "post",
      })
        .then(({ data }) => {
          if (data.state) {
            window.localStorage.setItem("token", data.data);
            axios(errorResp.config)
              .then((retryRet) => {;
                resolve(retryRet);
              })
              .catch((err) => {
                reject("error");
              });
          } else {
            //如果刷新token業務級失敗,也返回登錄頁
            router.push({ path: "/login" });
          }
        })
        .catch((err) => {
          //如果刷新token執行失敗,則跳回登錄頁
          router.push({ path: "/login" });
        });
    });
  }
),

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM