27

ボタンのクリックやテキストボックスへの入力(ドキュメント上でのマウスのホバーではない)など、ユーザーによるブラウザーでのアクティビティを監視するモニターを構築する場合。そのため、ユーザーからのアクティビティが長時間ない場合、セッションはタイムアウトになります。

jQueryなどを使わずにそれを行う必要があります。ajaxを使用する場合があります。もう一方の端にあるJavaサーブレットが望ましいです。

4

2 に答える 2

64

これは、アイドル時間を追跡する純粋な JavaScript の方法であり、特定の制限に達したときに何らかのアクションを実行します。それに応じて変更して使用できます

var IDLE_TIMEOUT = 60; //seconds
var _idleSecondsCounter = 0;
document.onclick = function() {
    _idleSecondsCounter = 0;
};
document.onmousemove = function() {
    _idleSecondsCounter = 0;
};
document.onkeypress = function() {
    _idleSecondsCounter = 0;
};
window.setInterval(CheckIdleTime, 1000);

function CheckIdleTime() {
    _idleSecondsCounter++;
    var oPanel = document.getElementById("SecondsUntilExpire");
    if (oPanel)
        oPanel.innerHTML = (IDLE_TIMEOUT - _idleSecondsCounter) + "";
    if (_idleSecondsCounter >= IDLE_TIMEOUT) {
        alert("Time expired!");
        document.location.href = "logout.html";
    }
}

このコードは、アラートを表示してリダイレクトする前に 60 秒待機し、マウスのクリック、マウスの移動、またはキーの押下などのアクションによってカウントが「リセット」されます。

可能な限りクロス ブラウザで、簡単に使用できるようにする必要があります。SecondsUntilExpire の ID を持つ要素をページに追加すると、残り時間の表示もサポートされます。

参照:ブラウザのアイドル時間を知るには?

于 2012-11-06T07:43:31.120 に答える
5

あなたが提案するアプローチの問題は、ユーザーがマウスを動かしたり入力を入力したりしても、セッションがタイムアウトすることです。したがって、セッション タイムアウトを 20 分に設定し、ユーザーが 21 分間入力し続けた場合、セッションは「アクティブ」であってもタイムアウトします。セッションがタイムアウトしない唯一の方法は、サーバーへの新しいリクエストです。

解決策 1: サーバーがセッション タイムアウトを制御できるようにする

バックグラウンドで Ajax リクエストを行っていない限り、セッションが更新され続けます。ページの読み込み時に JavaScript タイムアウトを設定し、そのようにユーザーに警告することができます。ユーザーがページにいる間、サーバーに他のリクエストを行わない限り、それを難し​​くする必要はありません。

setTimeout(function () {
   alert("You've timed out baby!");
}, 1200000); // 20 minutes in millisec (modify to your session timeout)

ユーザーが別のページにアクセスするか、ページをリロードすると、セッションが更新され、JavaScript タイマーがリセットされます。ユーザーがそのようなことをしないと、ユーザーがアラートを受け取ると同時にセッションがタイムアウトします。

解決策 2: クライアントがセッション タイムアウトを制御できるようにする

セッションの長さを JavaScript で完全に制御して、ユーザーが入力したりマウスを動かしたりするたびに更新されるようにしたい場合は、サーバーに対してバックグラウンドで Ajax リクエストを作成し続ける必要があります。セッションが更新されます。(これは空のダミー リクエストであり、サーバーにヒットするものである可能性があります)

次に、「ユーザーアクティビティ」と見なされるすべてのアクションを追跡し(AnhSirkは彼の回答で1つの方法を提案しています)、そのようなイベントが発生するたびにタイムアウトタイマーをリセットする必要があります. ユーザーが長時間アクティブでない場合は、サーバー上のページに Ajax リクエストを送信してセッションを無効にする必要があります。その後、セッションがタイムアウトしたことをユーザーに警告できます。

于 2012-11-06T07:53:01.277 に答える