問題の説明この製品では、セキュリティ上の理由から、ユーザーが長時間何も操作を行わない場合、銀行アプリと同様にログインページに戻され、再度ログインするよう求められるとしている。この記事では、この効果を実現する 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 コマンドを使用する詳細なチュートリアル
この記事では、ディスクを追加または拡張して、Vmare で有効にする方法について説明します。シナリオ...
MySQL 双方向バックアップはマスター-マスター バックアップとも呼ばれ、両方の MySQL サー...
目次予防必要条件AWSアカウントを申請する仮想マシンの申請と有効化仮想マシンを申請するセキュリティグ...
使用シナリオ:プロジェクトのページでは、頻繁に変更されず、個別のカスタマイズも伴わない大量のデータを...
実際には、対応する記述方法は多数ありますが、最も一般的なのは object + embedded で...
以下にリストされているすべてのブログはオリジナルであり、独自にデザインされています。これらは、他者が...
序文MySQL 8.0 より前は、Oracle、SQL SERVER、PostgreSQL などの他...
ビューポートとはモバイル ブラウザは、Web ページを仮想の「ウィンドウ」(ビューポート) に配置し...
昨日、円形のプログレスバー (Vue 円形プログレスバーを参照してください) についてブログを書きま...
メインライブラリの実行 CREATE DATABASE test CHARACTER SET utf...
Docker Compose は、Docker コンテナ クラスターのオーケストレーションを実現しま...
1. 背景LDAP を使用して、操作および保守に関連するユーザー名とパスワードを集中管理します。 1...
私たちのコンピューターには、ディレクトリ、写真、ソース コードなどのファイルが保存されています。たく...
vue3 が誕生してからかなり時間が経ち、筆者も最近になって vue3 を学び始めました。 vue2...
Windows 64 ビット版 MySQL 5.7 以降の解凍パッケージにデータディレクトリ、my-...