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

推薦する

Vue フロントエンド開発補助機能状態管理詳細例

目次マップ状態マップゲッターマップミューテーションマップアクション例まとめマップ状態コンポーネントが...

CentOS7 で MySQL 5.7.24 をコンパイルしてインストールする詳細なチュートリアル

目次依存関係をインストールするブーストをインストールMySQLをコンパイルしてインストールする構成依...

MySQLクエリは、フィールドが数値とカンマではないことを指定します。

コアSQL文数字を含まない MySQL クエリ ステートメント: SELECT * FROM tes...

jQuery ツリービュー ツリー構造アプリケーション

この記事では、jQueryツリービューツリー構造のアプリケーションコードを例として紹介します。具体的...

CocosCreator 一般的なフレームワーク設計リソース管理

目次Cocos Creator のリソース管理に関する問題リソースの依存関係リソースの使用レスローダ...

Docker execは複数のコマンドを実行します

docker exec コマンドは、実行中のコンテナ内でコマンドを実行できます。 docker ex...

Angular の 12 の典型的な問題について簡単に説明します

目次1. Angular 2 アプリケーションのライフサイクル フックとは何ですか? 2. Angu...

React でのポータルとエラー境界処理の実装

目次ポータルエラー境界処理エラー境界を使用しない場合はどうなりますか?注記ポータルスロットとも言えま...

Alibaba Cloud サーバーの購入とインストール方法

1. サーバーを購入するこの例では、購入したサーバーはAlibaba Cloudです。大学生はAli...

Linux デバイスに空き容量がありません inode の満杯により 500 エラーが発生します

iノードとは何ですか? inode を理解するには、まずファイル ストレージから始める必要があります...

最新の JavaScript で非同期タスクを書く方法

序文この記事では、非同期 JavaScript の進化と、それがコードの記述方法にどのような変化をも...

emとは?emとpxの紹介と変換方法

それは何ですか? em はフォントの高さを指し、どのブラウザでもデフォルトのフォントの高さは 16 ...

フレックスとポジションの互換性の詳細な説明マイニングノート

今日は、すべてのブラウザ (主に IE 9 以上と Chrome) と互換性のある自分のホームページ...

JavaScript キャンバスで動的な点と線の効果を実現

この記事では、動的な点と線の効果を実現するためのJavaScriptキャンバスの具体的なコードを参考...

経験者のHTMLの書き方と理由の分析

1. ナビゲーション: 順序なしリストとその他のラベル要素ナビゲーションを記述するために最も一般的に...