ウィンドウがアクティブに使用されていることを確認し、使用されていない場合はエンド ユーザーにログアウトされようとしていることを警告するにはどうすればよいですか?
-
01-07-2019 - |
質問
私の会社で新しいバックエンド システムに取り組んでいます。その要求の 1 つは、ウィンドウがロックダウンされ、ユーザーが長時間アイドル状態のままになった場合にログイン画面に送られるようにすることです。
クリック、マウスの移動、キー入力にリスナーをアタッチすることで、これを JavaScript で行うことになると思いますが、他のスクリプトをいじるのが心配です。
助言がありますか?
解決
まず、これを効果的にするには、このアイドル時間が終了した時点でユーザーがサーバーからログアウトしていることを確認する必要があります。そうしないと、クライアント側で何をしても効果がありません。ユーザーをログイン ページに送った場合は、戻るボタンをクリックするだけで済みます。
2 番目に、これを行う従来の方法は、「メタ リフレッシュ」タグを使用することです。これをページに追加すると:
<meta http-equiv="refresh" content="900;url=http://example.com/login"/>
15 分 (900 秒) 後にログイン ページに送信されます。これにより、ユーザーがページ上で何かをしている場合でも、そこに送信されます。アクティビティは検出されません。ページがブラウザ内でどれくらいの時間表示されているかを知るだけです。ユーザーは 1 ページに記入するのに 15 分もかからないため、通常はこれで十分です (stackoverflow.com は顕著な例外だと思います)。
ページ上のアクティビティを本当に検出する必要がある場合、最初の直感は正しいと思います。いくつかのものにイベント ハンドラーを追加する必要があります。検証などのために他のスクリプトをいじることが心配な場合は、インラインではなくプログラムでイベント ハンドラーを追加することを検討する必要があります。つまり、使用する代わりに、
<input type="text" onClick="doSomething;">
次のようにしてオブジェクト モデルに直接アクセスします。
Mozilla way: element.addEventListener('click' ...)
Microsoft way: element.attachEvent('onclick' ...)
そして、既存のコードが本来行うべきこと (検証?) を引き続き実行できるように、イベントを受け取った後にイベントを渡すようにしてください。
http://www.quirksmode.org/js/introevents.html これを行う方法については適切な記事が書かれています。
--
BMB
他のヒント
ユーザーが長時間ページを変更しなかった場合にログアウトさせることもできます。それが、Angel Learning Courseware システムが行うことのようです。
ただし、直面するもう 1 つの問題は、一部のユーザーが JavaScript を無効にしていることです。
ページにコードを配置できる場合、次の 2 つのことができます。
- JavaScript はマウスの動き、キーボードのアクティビティ、スクロールを検索します。
- HTML にメタ更新タグを挿入します。ユーザーがそのページに X 分以上滞在すると、自動的にログイン ページにリダイレクトされます。
サーバーにコードのみを配置できる場合:
- ページの変更間隔を追跡するセッション (Cookie など) を維持します。最後のリクエストから X 分を超えてページがリクエストされた場合は、リクエストされたページは提供されず、ログイン ページが提供されます。
メタ リフレッシュとサーバー技術を併用できます。更新されたページでは、「セッションの有効期限が近づいています。ここをクリックして戻って 30 秒以内に作業を続行してください」というメッセージが表示されます。
ユーザーがクリックしたボタンはサーバーのセッションをリセットし、ページバック機能を実行するため、(ほとんどのブラウザーで) 保持していたデータはそのまま残ります。更新ページでは JavaScript が必要ですが、元のページでは不要です。メタ更新だけです。ただし、JavaScript アクティビティ追跡が最適です。
-アダム
ページの読み込みイベントで setTimeout を使用して、ページを更新しないとログアウトされることをユーザーに警告する関数を起動できます。
5 分のセッション タイムアウトを使用すると、4 分後に警告を実行できます。
setTimeout(timeoutWarning, 240000);
function timeoutWarning() {
if(confirm('You have been idle for a while. Would you like to remain logged in?'))
window.location.refresh();
}