トークンの有効期限が切れたら、ページを更新します。ページの読み込み時にバックエンドに複数のリクエストを開始すると、繰り返しアラーム プロンプトが発行されます。処理後は、アラームは 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: 異なるインデックスを更新してMySQLのデッドロックルーチンを解決する
>>: MongoDB データベースの状態を監視する Zabbix3.4 メソッド
設定は非常にシンプルですが、毎回確認しないといけないので、記録だけ残しておきます。 1. インストー...
MySQL の全体的なアーキテクチャは、サーバー層とストレージ エンジン層に分かれています。サーバー...
目次MySQLネイティブレプリケーションに基づくマスター-マスター同期ソリューションGaleraレプ...
序文MySQLクエリはselectコマンドを使用し、limitとoffsetパラメータを使用して、指...
この記事では、WeChatアプレットのスクロールビューの左右連動を実現するための具体的なコードを参考...
目次1. import_tableの紹介2. データのロードとテーブル関数のインポートの例2.1 L...
目次1. MySQL 8.0.18のインストール2. 環境変数を設定する3. 接続テスト1. MyS...
1. 時間の種類は次のように分けられます。 1. ネットワーク時間(タイムゾーンの設定、ntpサーバ...
毎日jQueryプラグイン - 検索履歴を作成するためのものです。参考までに、具体的な内容は次のとお...
本日、開発中に、顧客からページをキャッシュしないように要求される方法に遭遇しました。調べたところ、ペ...
LNMPのようなアーキテクチャを持つウェブサイトは、一般的にPHPフレームワークに基づいて開発されて...
目次序文文章プリミティブ型プリミティブ値ラッパーオブジェクト物体コンストラクタ通常機能(関数)プリミ...
<br />これは 123WORDPRESS.COM が提供する一連のチュートリアルです...
1. 親コンポーネントは props を使用して子コンポーネントにデータを渡すことができます。 2....
デフォルトのテーブル名はbase_dataで、json列名はjson_valueです。 json_v...