トークンの有効期限が切れたときにページを更新するときに繰り返しプロンプトが表示されないようにする Vue について

トークンの有効期限が切れたときにページを更新するときに繰り返しプロンプトが表示されないようにする Vue について

トークンの有効期限が切れたら、ページを更新します。ページの読み込み時にバックエンドに複数のリクエストを開始すると、繰り返しアラーム プロンプトが発行されます。処理後は、アラームは 1 回だけ表示されます。

1. 問題現象

このページは長い間操作されていません。ページを更新すると、最初に「トークンの有効期限が切れています。もう一度ログインしてください。」というプロンプトがポップアップ表示され、次にログイン ページにジャンプし、その後、バックエンドから「トークンの有効期限が切れています。」というメッセージ プロンプトがポップアップ表示されます。

2. 原因分析

現在のページが初期化され、バックエンドからシステム パラメータを照会する呼び出しが複数回行われます。コードは次のとおりです。

作成された(){
    //= ...
    // 必要なシステム パラメータを取得します。注: getParameterClass メソッドはデータを非同期的に読み込みます。
    // 観察結果を印刷する必要がある場合は、watch を介して処理する必要があります // ユーザー タイプのパラメーター カテゴリを取得します this.commonFuncs.getParameterClass(this,"user_type","userTypeList","userTypeMap");

    // ユーザーステータスのパラメータカテゴリを取得します for(var i = 0; i < this.userStatusList.length; i++){
      var item = this.userStatusList[i];
      var mapKey = parseInt(item.itemKey);
      this.userStatusMap.set(mapKey, item);
    }

    // 性別のパラメータ クラスを取得します。 this.commonFuncs.getParameterClass(this,"gender","","genderMap");

    // 部門のパラメータ クラスを取得します。 this.commonFuncs.getParameterClass(this,"department","","deptMap");

    // ロールのパラメータ カテゴリを取得します。 this.commonFuncs.getParameterClass(this,"role","","roleMap");

    // ユーザーレコードを照会する this.queryUsers();
  },

これらのリクエストは axios 呼び出しであり、非同期的に実行されるため、ページを更新すると、これらのリクエストはほぼ即座に行われます。すると、これらのリクエストに対する応答が次々に返されます。

応答は、まず次の応答インターセプターによって処理されます。

// トークン関連のレスポンスインターセプターinstance.interceptors.response.use(response => {  
  if (応答) {
    スイッチ (response.data.code) {
      ケース 3: //トークンが空 ケース 4: //トークンの有効期限が切れている ケース 5: //トークンが正しくない localStorage.clear(); //ユーザー情報を削除 alert('トークンが無効です。もう一度ログインしてください!');
        // ログインページにジャンプするには router.replace({
              パス: '/login',
        });
        壊す;
      ケース 6: //アクセスが拒否されました// 403 ページにジャンプ router.replace({
          パス: '/forbidden',
        });        
        壊す;
      デフォルト:
        壊す;
    }
  }
  応答を返します。
}, エラー => {
  return Promise.reject(error.response.data.message) //インターフェースから返されたエラーメッセージを返します})

次に、リクエストが呼び出されるコードを入力します。

 this.instance.getParameterClass() は、
      this.$baseUrl、{"classKey" : classKey}
    ).then(res => {
      // コンソールログ(res.data);
      res.data.code == parent.global.SucessRequstCode の場合{
        // クエリが成功した場合 // 成功コード...
      }それ以外{
        アラート(res.data.message);
      }
    }).catch(エラー => {
      //alert('システムパラメータのクエリに失敗しました!');            
      コンソール.log(エラー);
    });

さて、質問です:

リクエストの場合、トークンの有効期限が切れると、レスポンス インターセプターは最初に警告プロンプトをポップアップ表示し、次に呼び出しサイトで別のプロンプトが表示されます。

アラート(res.data.message);

これは繰り返されます。

同時に送信される複数のリクエストの場合、トークンの有効期限が通知されたかどうかを記憶するためのマーカーが必要です。通知は 1 回だけ表示されます。通知された場合は、再度通知する必要はありません。

3. 解決策

3.1. インターセプターとリクエスト呼び出しでトークンの有効期限を繰り返し通知しないようにする

インターセプトした処理の戻りコードかどうかを確認するパブリック メソッドを記述し、/src/common/commonFuncs.js ファイルに配置します。コードは次のとおりです。

 /**
   * リクエストの戻りコードがインターセプトされているかどうかを判定します。リクエストがインターセプトされていることを示すには true を返します。 * このメソッドは呼び出し側で使用されます。インターセプトされた戻りコードのエラー メッセージを処理する必要はありません。 * @param {request return code} code 
   */
  isInterceptorCode(コード){
    スイッチ(コード){
      ケース 3: //トークンが空です ケース 4: //トークンの有効期限が切れています ケース 5: //トークンが正しくありません ケース 6: //アクセスが禁止されています true を返します。
      デフォルト:
        壊す;
    }
    false を返します。
  }

次に、失敗した戻りを処理するためのすべての呼び出しが次のように変更されます。

 if (!this.commonFuncs.isInterceptorCode(res.data.code)){
          アラート(res.data.message);
        }

このようにして、傍受処理と通話処理の重複したアラートが排除されます。

3.2. 1つのプロンプトで複数のリクエストを処理する

グローバル変数ファイル /src/common/global.js に、トークン無効フラグを追加します。コードは次のとおりです。

//グローバル変数エクスポートデフォルト{
  // リクエスト成功の戻りコード SucessRequstCode: 0,

  // トークン無効フラグ TokenInvalidFlag: 0
}

次に、インターセプター コードを変更します。

// トークン関連のレスポンスインターセプターinstance.interceptors.response.use(response => {  
  if (応答) {
    スイッチ (response.data.code) {
      case 0: //Normal// トークン無効フラグをリセットします。global.TokenInvalidFlag = 0 に設定します。
        壊す;            
      ケース 3: //トークンが空 ケース 4: //トークンが期限切れ ケース 5: //トークンが正しくない localStorage.clear(); //ユーザー情報を削除する if (global.TokenInvalidCounter == 0){
          alert('トークンの有効期限が切れています。もう一度ログインしてください!');
        }
        // トークン無効フラグを1に設定する
        グローバル.TokenInvalidFlag = 1;
            
        // ログインページにジャンプするには router.replace({
              パス: '/login',
        });
        壊す;
      ケース 6: //アクセスが拒否されました// 403 ページにジャンプ router.replace({
          パス: '/forbidden',
        });        
        壊す;
      デフォルト:
        壊す;
    }
  }
  応答を返します。
}, エラー => {
  return Promise.reject(error.response.data.message) //インターフェースから返されたエラーメッセージを返します})

つまり、トークン有効期限切れメッセージを初めて受信したとき(この時点ではTokenInvalidFlag=0)にプロンプ​​トが表示され、その後1に設定されます(この時点ではTokenInvalidFlag=1)。後続のリクエストに対する応答では警告プロンプトは表示されません。再ログインが成功したことを示す成功の戻りコードが受信されるまで、0 にリセットされます。

テスト後、この処理は期待どおりの効果を達成しました。つまり、トークンの有効期限が切れると、ページが更新され、アラームが 1 つだけ表示されます。

著者: アラブ 1999 出典: http://www.cnblogs.com/alabo1999/ この記事の著作権は著者と Cnblog Park が共有しています。転載は歓迎しますが、著者の同意なしにこの声明を保持し、元のリンクを記事ページの目立つ位置に提供する必要があります。そうしないと、法的責任を追求する権利が留保されます。良い習慣を身に付け、良い記事に賛成してください。

トークンの有効期限が切れたときにページを更新するよう繰り返しプロンプトが表示されるのを Vue が排除する方法についての説明はこれで終わりです。Vue によるページ更新に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • SpringBoot JWTはトークンログインリフレッシュ機能を実装します
  • uniappの無痛トークンリフレッシュ方法の詳細な説明
  • ASP.NET Core Web API における JWT リフレッシュ トークンの詳細な説明
  • リクエスト中にトークンの有効期限が切れた場合、トークン操作を自動的に更新する
  • SpringSecurity Jwt トークン自動更新の実装
  • springboot+jwt に基づくリフレッシュトークンプロセス分析
  • Vue での Axios インターセプター トークン更新メカニズムのサンプル コード
  • Laravel (Lumen) は JWT-Auth リフレッシュトークンの問題を解決します
  • シームレスなトークンリフレッシュを実現する方法

<<:  異なるインデックスを更新してMySQLのデッドロックルーチンを解決する

>>:  MongoDB データベースの状態を監視する Zabbix3.4 メソッド

推薦する

Alibaba Cloud centos7にmysql8.0.22をインストールする詳細なチュートリアル

1. MySQLインストールパッケージをダウンロードするまず、https://dev.mysql.c...

JSはプログレスバーをドラッグして要素の透明度を変更することを実装しています

今日ご紹介したいのは、ネイティブ JS を使用してプログレス バーをドラッグし、要素の透明度を変更す...

MySQL データベースの集計クエリと結合クエリ操作

目次1. クエリ結果を挿入する2. 集計クエリ2.1 はじめに2.2 集計関数2.3 group b...

HTMLシールドの右クリックメニューと左クリック入力機能の例

右クリックメニューを無効にする <body oncontextmenu=self.event....

MySQL 5.7.16 のインストールと設定方法のグラフィック チュートリアル (Ubuntu 16.04)

Ubuntu 16.04 に MySQL 5.7 をインストールするにはどうすればいいですか?メイ...

js配列の基本的な使い方のまとめ

序文配列は特別な種類のオブジェクトです。 js には実際の配列はなく、オブジェクトを使用して配列をシ...

デスクトップ仮想化を実現するために Hyper-V を展開する手順 (グラフィック チュートリアル)

Hyper-V を展開するためのハードウェア要件は次のとおりです。 64 ビット プロセッサ、具体...

MySQL 8.0.23 のインストールと設定方法のグラフィックチュートリアル (Win10 の場合)

この記事では、MySQL 8.0.23のインストールと設定方法を参考までに紹介します。具体的な内容は...

JS のオブジェクトリテラルの詳細な説明

目次序文1. オブジェクト構築にプロトタイプを設定する1.1 __proto__ の使用における特殊...

マインスイーパゲームを実装するための jQuery プラグイン (1)

この記事では、jQueryプラグインを使用したマインスイーパゲームの最初の記事の具体的なコードを参考...

JavaScriptでシンプルなスクロールウィンドウを実装する

この記事では、スクロールウィンドウを実装するためのJavaScriptの具体的なコードを参考までに紹...

VirtualBox でのホストオンリー + NAT モードのネットワーク構成

VirtualBoxのHost Only+NATモードのネットワーク構成は参考用です。具体的な内容は...

axios を使用してプロジェクト内の複数の繰り返しリクエストをフィルタリングする方法

目次1. はじめに:この場合、通常は 2 つのアプローチがあります。 2. CancelToken ...

MySQL 権限昇格のさまざまな形態の概要

目次1. Webshel​​lを書く出力ファイルにシェルを書き込むログファイル書き込みシェル2. U...

検索エンジンのウェブサイトの入り口の無料コレクション

1: Baiduウェブサイトログイン入口ウェブサイト: http://www.baidu.com/s...