トークンの有効期限が切れたときにページを更新するときに繰り返しプロンプトが表示されないようにする 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 メソッド

推薦する

Linux のような環境で jdk1.8 をインストールし、環境変数を設定する方法の詳細な説明

設定は非常にシンプルですが、毎回確認しないといけないので、記録だけ残しておきます。 1. インストー...

MySQL の全体的なアーキテクチャの紹介

MySQL の全体的なアーキテクチャは、サーバー層とストレージ エンジン層に分かれています。サーバー...

MySQL アクティブ-アクティブ同期レプリケーションの 4 つのソリューションの詳細な説明

目次MySQLネイティブレプリケーションに基づくマスター-マスター同期ソリューションGaleraレプ...

MySQL クエリにおける LIMIT の大きなオフセットによって引き起こされるパフォーマンス低下の分析

序文MySQLクエリはselectコマンドを使用し、limitとoffsetパラメータを使用して、指...

WeChatアプレットのスクロールビューが左右の連動を実現

この記事では、WeChatアプレットのスクロールビューの左右連動を実現するための具体的なコードを参考...

MySQL Shell import_tableデータインポートの実装

目次1. import_tableの紹介2. データのロードとテーブル関数のインポートの例2.1 L...

MySql Installer 8.0.18 画像とテキストによるビジュアル インストール チュートリアル

目次1. MySQL 8.0.18のインストール2. 環境変数を設定する3. 接続テスト1. MyS...

Linux システムにおける時間設定の概要

1. 時間の種類は次のように分けられます。 1. ネットワーク時間(タイムゾーンの設定、ntpサーバ...

検索履歴を実装するjQueryプラグイン

毎日jQueryプラグイン - 検索履歴を作成するためのものです。参考までに、具体的な内容は次のとお...

ページキャッシュを無効にするいくつかの方法を共有する

本日、開発中に、顧客からページをキャッシュしないように要求される方法に遭遇しました。調べたところ、ペ...

Nginx サーバーで URL リンクを設定する方法

LNMPのようなアーキテクチャを持つウェブサイトは、一般的にPHPフレームワークに基づいて開発されて...

JavaScriptのプリミティブ値とラッパーオブジェクトの詳細な紹介

目次序文文章プリミティブ型プリミティブ値ラッパーオブジェクト物体コンストラクタ通常機能(関数)プリミ...

HTML テーブル マークアップ チュートリアル (1): テーブルの作成

<br />これは 123WORDPRESS.COM が提供する一連のチュートリアルです...

Vue.js での $emit の使用に関する詳細な説明

1. 親コンポーネントは props を使用して子コンポーネントにデータを渡すことができます。 2....

MySQL json 形式のデータクエリ操作

デフォルトのテーブル名はbase_dataで、json列名はjson_valueです。 json_v...