最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端雙token無感刷新圖文詳解

 更新時間:2024年09月02日 09:58:17   作者:真的很上進  
實現(xiàn)token無感刷新對于前端來說是一項十分常用的技術(shù),這篇文章主要給大家介紹了關于前端雙token無感刷新的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

1.雙token的使用場景

眾所周知,Token作為用戶獲取受保護資源的憑證,必須設置一個過期時間,否則一次登錄便可永久使用,認證功能就失去了意義。但是矛盾在于:過期時間設置得太長,用戶數(shù)據(jù)的安全性將大打折扣;過期時間設置得太短,用戶就必須每隔一段時間重新登錄,以獲取新的憑證,這會極大挫傷用戶的積極性。

1.假如你正在訪問某個平臺,沉浸式的使用了一小時后卻突然彈出一個token過期,重定向到了登錄頁…

2.假如你正在某網(wǎng)站里填寫你的個人信息或者內(nèi)容繁多的表單選項,填到一半的時候token過期了…提示需要重新登錄,結(jié)果登錄回來之后又要重新填寫表單信息…T~T

3.假如你正在激情的搶票、蹲卡點秒殺活動!結(jié)果剛要搶購卻因token過期被重定向到登錄頁…

是不是代入起來就已經(jīng)很頭疼了?那如何避免這種情況發(fā)生呢,接下來我們就引入今天的主角——無感刷新token

2.什么是token

在介紹雙token無感刷新之前,我們先簡單介紹一下什么是token吧!

token是一種用戶標識,表示用戶身份,類似于我們的身份證件。Token 是在服務端產(chǎn)生的。如果前端使用用戶名/密碼向服務端請求認證,服務端認證成功,那么在服務端會返回 Token 給前端。前端可以在每次請求的時候帶上 Token 證明自己的合法地位。如果這個 Token 在服務端持久化(比如存入數(shù)據(jù)庫),那它就是一個永久的身份令牌。

3.如何無感刷新token(圖文+代碼)

token過期了之后,我們應該如何做到讓用戶無感知的自動刷新token呢?

目前比較常見的有三種方法:

  • 寫個定時器,時間一到就刷新getToken接口來獲取新token(極其不推薦):消耗性能,不斷的去發(fā)送網(wǎng)絡請求,不建議這種做法
  • 后端返回一個過期時間,前端每次發(fā)送請求都去判斷token是否過期,如果過期就調(diào)用getToken接口來獲取新token(不推薦):需要后端額外提供一個過期時間的字段;使用了本地時間判斷,若本地時間被篡改,特別是本地時間比服務器時間慢時,攔截會失敗。
  • 在請求響應攔截器中攔截,判斷token 返回過期后,調(diào)用刷新token接口。(推薦???):無性能損耗

在登錄成功后,后端會返回兩個Token,一個是Access Token(即短token),一個是Refresh Token(即長token)。前端需要將這兩個Token保存到本地存儲中,例如localStoragesessionStorage中,以便在需要時使用。

當需要訪問API時,前端將從本地存儲中獲取Access Token,并將其放入請求頭中發(fā)送到后端。如果Access Token過期了,后端會返回一個錯誤響應,并提示前端進行刷新Token的操作。

前端可以使用下面的代碼實現(xiàn)刷新Token的操作:

import axios from "axios";
import { getToken, setToken, setRefreshToken, getRefreshToken } from "./token";
import { ElMessage } from "element-plus";
import router from "@/router";
import { refreshToken } from "./refreshtoken";
const service = axios.create({
  baseURL: "http://localhost:8087",
  headers: {
    Authorization: `Bearer ${getToken()}`,
  },
});
// 添加請求攔截器
service.interceptors.request.use(
  function (config) {
    if (config.url === "/refresh_token") {
      config.headers["Authorization"] = `Bearer ${getRefreshToken()}`;
    }
    // 在發(fā)送請求之前做些什么
    return config;
  },
  function (error) {
    // 對請求錯誤做些什么
    return Promise.reject(error);
  }
);

// 添加響應攔截器
service.interceptors.response.use(async (res) => {
  // 1.第一次登錄了以后 后臺在header里面返回了短token 那么要先接收token存儲到localstorage里面
  if (res.headers.authorization) {
    const token = res.headers.authorization.replace("Bearer ", "");
    // 設置短token
    setToken(token);
    service.defaults.headers.Authorization = `Bearer ${token}`;
  }
  // 2. 第一次登錄了以后 后臺在header里面返回了長token 那么要先接受長token 存儲到localstorage里面
  if (res.headers.refreshtoken) {
    const refreshtoken = res.headers.refreshtoken.replace("Bearer ", "");
    // 設置長token
    setRefreshToken(refreshtoken);
  }
  // 3 假設當后端返回401的時候 代表token失效 時間到了 這個時候正常處理就是跳到登錄頁面
  // 但是在實際的業(yè)務場景的時候 用戶體驗非常不好

  if (res.data.code === 401) {
    // ElMessage({
    //   message: "token失效",
    //   type: "warning",
    // });
    // router.push("/login");
    // 這個地方就是短token失效了 提交表單 不跳到登錄頁面 因為這樣用戶體驗很不好
    // 請求剛剛定義的一個接口
    // 這個時候 提交表單的接口 還沒提交 停在這里了 現(xiàn)在要干啥?請求
    // 干啥了? 請求了changtoken攜帶過去 刷新token的接口
    const success = await refreshToken();
    if (success) {
      res.config.headers.Authorization = `Bearer ${getToken()}`;
      const result = await service.request(res.config);
      return result;
    }
  }

  return res.data;
});

function request(options) {
  options.method = options.method || "get";
  // 關于get請求參數(shù)的調(diào)整
  if (options.method.toLowerCase() === "get") {
    options.params = options.data;
  }

  return service(options);
}

export default request;

對應的token.jsrefreshtoken.js代碼:

模擬網(wǎng)卡的時候,響應數(shù)據(jù)還沒返回就重復刷新的情況:(本質(zhì)就是借助Promise。將請求存進隊列中后,同時返回一個Promise,讓這個Promise一直處于Pending狀態(tài)(即不調(diào)用resolve),此時這個請求就會一直等啊等,只要我們不執(zhí)行resolve,這個請求就會一直在等待。當刷新請求的接口返回來后,我們再調(diào)用resolve,逐個重試。)

token存進localstorage里,同時為了防止多次刷新

使用 Token 和 Refresh Token 的時序圖如下:

1)登錄

2)業(yè)務請求

3)Token 過期,刷新 Token

現(xiàn)在,我們就已經(jīng)成功實現(xiàn)了長短token的無感刷新啦!

一定要理解文章開頭這張圖的流程哦

總結(jié)

到此這篇關于前端雙token無感刷新的文章就介紹到這了,更多相關前端雙token無感刷新內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

政和县| 团风县| 乌鲁木齐县| 台州市| 炉霍县| 扶绥县| 临汾市| 滦平县| 常熟市| 玉山县| 义乌市| 满城县| 金阳县| 上饶县| 黄大仙区| 喀喇| 抚宁县| 科技| 荣成市| 景宁| 汕头市| 龙岩市| 沾益县| 铁岭县| 文山县| 集贤县| 平乐县| 桂阳县| 金湖县| 正安县| 莫力| 仪陇县| 历史| 平顶山市| 湄潭县| 巴林右旗| 乐昌市| 新和县| 张家口市| 东山县| 定陶县|