<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      業務場景---Token無感刷新

      業務場景描述

      假設用戶正在填寫一個復雜的表單,由于表單內容繁多,用戶花費了很長時間才填完。這時,如果Token已經過期,系統會讓用戶重新登錄,這種體驗顯然是非常糟糕的。為了避免這種情況,我們需要在Token即將過期或已經過期時,自動刷新Token,而不影響用戶正在進行的操作。

      技術實現思路

      一、準備工作

      1. 前端框架選擇:本文以Vue.js為例,結合Vue Router和Axios來實現Token無感刷新機制。
      2. 后端支持:后端需要提供刷新Token的接口,當接收到舊的Token時返回一個新的Token。

      二、關鍵技術點

      1. 攔截請求:使用Axios攔截器來檢測每一個請求的狀態,如果發現Token過期,則觸發刷新Token的邏輯。
      2. 刷新Token:實現一個專門用于刷新Token的方法,該方法會在舊的Token過期時自動調用并更新Token。
      3. 請求隊列:在刷新Token期間,暫停其他需要Token的請求,待Token刷新成功后,重新發送這些請求。

      三、具體實現步驟

      1. 配置Axios攔截器

      首先,配置Axios攔截器來檢測請求和響應的狀態,并在Token過期時觸發刷新Token的邏輯。

      import axios from 'axios';
      import store from './store'; // 假設使用Vuex來管理全局狀態
      import router from './router';
      
      let isRefreshing = false;
      let requests = [];
      
      axios.interceptors.request.use(
        config => {
          const token = store.state.token;
          if (token) {
            config.headers['Authorization'] = 'Bearer ' + token;
          }
          return config;
        },
        error => {
          return Promise.reject(error);
        }
      );
      
      axios.interceptors.response.use(
        response => {
          return response;
        },
        error => {
          const { config, response } = error;
          const originalRequest = config;
          
          if (response && response.status === 401) {
            if (!isRefreshing) {
              isRefreshing = true;
              return refreshToken().then(newToken => {
                store.commit('setToken', newToken);
                originalRequest.headers['Authorization'] = 'Bearer ' + newToken;
                processQueue(null, newToken);
                return axios(originalRequest);
              }).catch(err => {
                processQueue(err, null);
                store.commit('logout');
                router.push('/login');
                return Promise.reject(err);
              }).finally(() => {
                isRefreshing = false;
              });
            } else {
              return new Promise((resolve, reject) => {
                requests.push((token) => {
                  originalRequest.headers['Authorization'] = 'Bearer ' + token;
                  resolve(axios(originalRequest));
                });
              });
            }
          }
          return Promise.reject(error);
        }
      );
      
      function processQueue(error, token = null) {
        requests.forEach(promise => {
          if (error) {
            promise.reject(error);
          } else {
            promise.resolve(token);
          }
        });
        requests = [];
      }

       

      2. 實現刷新Token的方法

      接下來,實現一個用于刷新Token的方法refreshToken。這個方法會調用后端接口來獲取新的Token。

      function refreshToken() {
        return new Promise((resolve, reject) => {
          axios.post('/auth/refresh', {
            refreshToken: store.state.refreshToken
          }).then(response => {
            if (response.data.success) {
              resolve(response.data.token);
            } else {
              reject(response.data.message);
            }
          }).catch(error => {
            reject(error);
          });
        });
      }

       

      3. 更新Vuex狀態管理

      確保在Vuex中有相關的狀態和方法來管理Token和用戶登錄狀態。

       

      const store = new Vuex.Store({
        state: {
          token: localStorage.getItem('token') || '',
          refreshToken: localStorage.getItem('refreshToken') || '',
          user: {}
        },
        mutations: {
          setToken(state, token) {
            state.token = token;
            localStorage.setItem('token', token);
          },
          setRefreshToken(state, refreshToken) {
            state.refreshToken = refreshToken;
            localStorage.setItem('refreshToken', refreshToken);
          },
          logout(state) {
            state.token = '';
            state.refreshToken = '';
            state.user = {};
            localStorage.removeItem('token');
            localStorage.removeItem('refreshToken');
          }
        }
      });

       

      4. 處理登錄邏輯

      確保在用戶登錄時,正確地存儲Token和刷新Token。

      function login(credentials) {
        return axios.post('/auth/login', credentials).then(response => {
          store.commit('setToken', response.data.token);
          store.commit('setRefreshToken', response.data.refreshToken);
        });
      }

       

      總結:當用戶在填寫復雜表單時,即使Token過期也不會中斷他們的操作,從而提供了更好的用戶體驗。這個機制不僅適用于表單填寫,還可以廣泛應用于任何需要長時間交互的Web應用場景中。

       

      posted @ 2024-07-27 12:33  最小生成樹  閱讀(1948)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 日本大片在线看黄a∨免费| 国产一区二区内射最近更新| 色婷婷欧美在线播放内射 | 国产成人免费观看在线视频| 中文激情一区二区三区四区| 天天拍夜夜添久久精品大| 中文字幕日韩区二区三区| 淮安市| 亚洲精品综合一区二区在线 | 福利一区二区不卡国产| 亚洲另类丝袜综合网| 少妇午夜啪爽嗷嗷叫视频| 亚欧成人精品一区二区乱| 搡老熟女老女人一区二区| 口爆少妇在线视频免费观看| 夜夜爽日日澡人人添| 四虎在线中文字幕一区| 国产一级r片内射免费视频| 久久99热只有频精品6狠狠| 国产一二三五区不在卡 | 国产精品亚洲а∨天堂2021| 久久精品国产福利一区二区 | 国产成人无码aa精品一区| 国产三级精品三级色噜噜| 国产高清一区二区不卡| 午夜性爽视频男人的天堂| 撩起胸让我的?蹭来蹭去| 久久88香港三级台湾三级播放| 亚洲国产精品线观看不卡| 正定县| 国产超碰无码最新上传| 影音先锋大黄瓜视频| 色又黄又爽18禁免费网站现观看 | 婷婷久久香蕉五月综合加勒比| 久久人体视频| 91区国产福利在线观看午夜| 国产精品99久久免费| 亚洲中文字幕无码爆乳| 午夜福利激情一区二区三区| 国产美女被遭强高潮免费一视频| 国产高跟黑色丝袜在线|