問題の説明この製品では、セキュリティ上の理由から、ユーザーが長時間何も操作を行わない場合、銀行アプリと同様にログインページに戻され、再度ログインするよう求められるとしている。この記事では、この効果を実現する 2 つの方法、つまりフロントエンド制御とバックエンド制御について説明します。それぞれの詳細と適用可能な使用シナリオが異なります。 フロントエンド制御(方法1)アイデアまず、ユーザーが長期間操作を行わない具体的な兆候は何でしょうか?実際には、イベントが長い間トリガーされていないかどうかです。 たとえば、ユーザーが長時間操作していない場合、マウスのクリック イベント、マウス ホイール イベント、マウスの移動イベントなどは発生しません。これらのイベントを監視するだけで済みます。これらのイベントが長時間トリガーされない場合は、ユーザーが長時間操作していないことを意味し、ルートはログイン ページにジャンプできます。 これら 3 つのイベントのうち、より実用的なマウス クリック イベントを選択しました。一般的に、プロジェクトの最初のページはログイン ページであるため、ユーザーがログイン ページでログイン ボタンをクリックすると、ログイン ボタンをクリックした時間が記録され、セッション ストレージに保存されます。メイン ページにジャンプすると、ユーザーがページをクリックするたびに、セッション ストレージに保存されている時間が更新されます。同時に、ループ タイマーがページにバインドされます。一定間隔で、現在の時間と、セッション ストレージに保存されている最後のクリック イベントの時間を比較します。差が一定時間を超えると、ユーザーはログイン ページに強制的に移動されます。 コードlogin.vue ページ //html <el-button type="primary" @click="loginIn">クリックしてログイン</el-button> // js メソッド: { ログイン() { // 最初のクリックの時間を保存します sessionStorage.setItem("lastClickTime", new Date().getTime()); //バックエンドをシミュレートしてトークンを返す sessionStorage.setItem('トークン'、"トークン") this.$router.push({ パス: "/"、 }); }, } Home.vue ページ <テンプレート> <div class="homeBox"> <!-- 左側はメニュー レベルです --> <div class="left"> <div class="leftNav"> <el-メニュー :default-active="アクティブインデックス" クラス="elMenu" 背景色="#333" テキストカラー="#B0B0B2" アクティブテキストカラー="#fff" :unique-opened="true" ルーター ref="elメニュー" > <el-menu-item index="/vue"> <i class="el-icon-location-outline"></i> <span slot="title">vue ページ</span> </el-menu-item> <el-menu-item index="/react"> <i class="el-icon-star-off"></i> <span slot="title">React ページ</span> </el-menu-item> <el-menu-item index="/angular"> <i class="el-icon-pear"></i> <span slot="title">角度ページ</span> </el-menu-item> </el-menu> </div> </div> <!-- 右側はビュー階層です --> <div class="right"> <div class="rightTop"> <el-button type="primary" plain @click="loginOut">ログアウト</el-button> </div> <div class="rightBottom"> <ルータービュー></ルータービュー> </div> </div> </div> </テンプレート> <スクリプト> エクスポートデフォルト{ 名前: "ホーム", データ() { 戻る { アクティブインデックス: this.$route.path, タイマー: null、 }; }, 作成された() { /* 最初のステップ: コンポーネントが初期化され、ロードされると、クリック イベントをリッスンするようにバインドされます。注: addEventListener の 3 番目のパラメータをここで追加する必要があります。 3 番目のパラメータは、バブリングかキャプチャリングかを決定します (バブリングの場合は false、キャプチャリングの場合は true がデフォルト)。クリック イベントをリッスンするようにバインドしているため、トップレベルの DOM 位置でクリック イベントをキャプチャします。そのため、3 番目のパラメータ true を追加して、内部レイヤーの任意の場所でクリック イベントをリッスンし、クリック時間を保存できるようにする必要があります。*/ ウィンドウにイベントリスナーを追加します( "クリック"、 () => { // 便宜上、クリック イベントの時刻を sessionStorage に直接保存し、簡単に取得して比較できるようにします。sessionStorage.setItem("lastClickTime", new Date().getTime()); }, 真実 ); }, マウント() { /* ステップ2: コンポーネントが初期化されロードされると、タイマーをバインドして、タイマーの定期的なポーリングを通じて現在の時刻と最後のクリック時刻の差を比較する必要があります*/ これはタイムアウトです。 }, メソッド: { タイムアウト() { // タイマーを使用する前に、タイマーをクリアします。clearInterval(this.timer); this.timer = setInterval(() => { let lastClickTime = sessionStorage.getItem("lastClickTime") * 1; // 最後のクリックの文字列時間をデジタル時間に変換します。let nowTime = new Date().getTime(); // 現在の時刻を取得します。console.log("現在の時刻と前回のクリック時刻", nowTime, lastClickTime); // 要件は次の通りとします: 5秒間クリックが行われなかった場合、ログインとログアウトのプロンプトが表示されます if (nowTime - lastClickTime > 1000 * 5) { // ユーザーにこれを表示します。$message({ type: "warning", message: "タイムアウト、ログアウトしました" }); // ここでタイマーをクリアしてタスクを終了する必要があります clearInterval(this.timer); //最後にログインページに戻ります this.$router.push({ path: "/login" }); } }, 1000); }, }, 破棄する前に() { // 最後のステップは、タイマーをクリアし、ページを離れるときにクリック イベント clearInterval(this.timer) をバインド解除することです。 window.removeEventListener("click", () => {}, true); }, }; </スクリプト> ここで階層的な対応に注意してください。私のプロジェクトの階層関係は、Home.vue ページが App.vue ページの内側のレイヤーであり、対応するビューもあり、ビューがページ全体の関係に対応しています。ルーティング テーブルの階層とルーター ビューの関係に応じて、適切な階層を選択し、対応するクリック イベントとタイマーをバインドします。 つまり、階層関係は、login.vueレベルと並行して次のレベルを選択することです。そうしないと、タイマーとクリックバインディングイベントもlogin.vueページで実行されます。 レンダリング バックエンド制御(方法2)アイデアこのバックエンド制御方法は、フロントエンド制御ほど制限的ではありませんが、使用することもできます。 バックエンドはJWTメカニズムを使用して返されるステータスコードを制御します。 コードここでは、main.jsのVueのインスタンスオブジェクトをグローバルオブジェクトwindowにマウントし、レスポンスインターセプターのvmオブジェクトでルーティングジャンプメソッドを使用できるようにします。 main.js ファイル // ウィンドウオブジェクトにマウント window.vm = new Vue({ 店、 ルーター、 レンダリング: h => h(App), }).$mount('#app') レスポンスインターセプターファイル http.interceptors.response.use((res) => { console.log('グローバルに登録',vm); var コード = res.data.code; if(code == 4567){ // 4567 はタイムアウト ステータス コードです。この記号が表示されたら、ユーザーにログアウトを求めます。 // この時点でルート ジャンプは this.$router.push() ではないことに注意してください。 vm._router.push({ path: "/login" }); } res.dataを返す }, (エラー) => { // コンソール.log(エラー) Promise.reject(error) を返します。 }) VMインスタンスオブジェクトを印刷する したがって、レスポンスインターセプターのルートジャンプは vm._router.push({ path: "/login" }) になります。 要約する上記の2つの方法を使用できます。どちらの方法を使用するかは状況によって異なります。 以上で、Vueユーザーが長時間操作しない場合のログインページへのログアウト方法についての2つの説明は終了です。Vueユーザーが長時間操作しない場合のログアウトに関するより関連性の高いコンテンツについては、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL における一般的なランキングの問題をいくつかまとめます
>>: Linux で xargs コマンドを使用する詳細なチュートリアル
目次1. setTimeout() タイマー2. setTimeout() タイマーを停止する3. ...
効果画像(境界線の色が薄すぎるので、{} で囲みます): { }参考リンク Pure CSS バブル...
最近、画像、ビデオ、CSS/JS などの静的リソースを配置するために nginx を使用する方法を学...
目次1. Docker Compose とは何ですか? 2. Docker Composeのインスト...
MySQL スロー クエリ ログは、問題のあるクエリを追跡するのに非常に役立ちます。現在のプログラム...
目次Vueのリスナーとは何かリスナーの使い方vue リスナーウォッチVue リスナー - ディープリ...
サーバーマッチングロジックNginx は、リクエストを実行するサーバー ブロックを決定するときに、サ...
注: 私はCentosを使ってdockerをインストールしていますステップ1: Dockerをインス...
バグ図のように、削除文とパラメータをデータベースにコピーして実行し、2つのデータを削除しようとしたの...
NULL および NOT NULL 修飾子、DEFAULT 修飾子、AUTO_INCREMENT 修...
この記事は、WeChat アプレットを使用して作成された簡単な計算機です。興味のある方はご覧ください...
目次概要型アサーション構文ではインスタンスオブ構文typeof構文要約する概要TypeScript ...
目次1. 概要2. 名前フィールド3. バージョンフィールド4. 説明フィールド5. キーワードフィ...
ネイティブjsカプセル化シームレスカルーセルプラグイン、参考までに、具体的な内容は次のとおりです。例...
mysql の存在する例と存在しない例の詳細な説明テーブルA |列1 | 列1 | 列3 |テーブル...