0

私は GWT-ext アプリケーションに取り組んでいます。このアプリケーションでは、クライアント側のセッションを管理しました。このために、以下のコードを書きます。

セッションを管理するには: import com.google.gwt.user.client.Timer;

public class ClientTimers {

    private static final Timer SESSION_MAY_HAVE_EXPIRED_TIMER = new Timer() {

        @Override
        public void run() {
            // Warn the user, that the session may have expired.
            // You could then show a login dialog, etc...
        }
    };

    public static void renewSessionTimer() {

        // First cancel the previous timer
        SESSION_MAY_HAVE_EXPIRED_TIMER.cancel();

        // Schedule again in 5 minutes (maybe make that configurable?)
        // Actually, let's subtract 10 seconds from that, because our timer
        // won't be synchronized perfectly with the server's timer.
        SESSION_MAY_HAVE_EXPIRED_TIMER.schedule(5 * 60 * 1000 - 10000);
    }
}

ユーザー アクティビティを取得するには:

    Ext.get("pagePanel").addListener("click", new EventCallback() {
        @Override
        public void execute(EventObject e) {
            //MessageBox.alert("On Mouse Click");
    });

    Ext.get("pagePanel").addListener("keydown", new EventCallback() {

        @Override
        public void execute(EventObject e) { //
            //MessageBox.alert("On Key Press Click");
        }
    });

このコードは正常に動作していますが、私の問題: このコードは、タイムアウトが発生すると自動的にログアウトします。私のコードでは、クリックまたはキーを押したときにログアウトする必要があります。ケースは次のようなものです: ユーザーがログインしていて、ログアウトする時間が 5 分である場合、ユーザーは上記のコードに従って、画面上で現在よりも何も操作を行わないで、5 分が完了すると自動的にログアウトします。

ここで私の要件は、ユーザーがログインして 5 分間何もしない場合です。自動的にログアウトするべきではありません。5 分間の完了時にログアウトする代わりに、ユーザーが 6 分間クリックまたはキーを押した場合その後、ログアウト プロセスを実行する必要があります。

基本的に、タイマーが指定された時間を超えたときのログアウト プロセスは、自動的にではなく、ユーザー アクティビティで実行する必要があります。

4

3 に答える 3

2

タイマーで、1 秒ごとに変数をインクリメントします。また、ユーザーが 5 分後または 6 分後にいずれかのボタンをクリックすると、カウンター変数がチェックされ、変数が 6 より大きい場合はWindow.Location.reload();を使用できます。ログアウトまたは reload() します。

于 2011-04-29T12:04:52.000 に答える
1

あなたが探しているものは次のとおりだと思います:

Window.Location.reload();

タイマーを使用して数秒ごとに起動するため、ユーザーは常にアクティブであるように見えます。

(ところで、 gwt -ext の Window close issuesからそれがあります)

于 2011-04-29T12:01:40.187 に答える
0

領域全体をカバーする非表示の div に JavaScript イベント ハンドラーをインストールします。イベントを取得した場合は、AJAX 要求をサーバーに送信します。

その後、サーバーは必要なことを何でも実行できます。クライアント側では、AJAX リクエストからの応答を待って、「ログアウトしました」と表示できます。

この方法には欠点が 1 つあります。それは、セッションに保存されたオブジェクトが長時間存続することです。そのため、ユーザーがログアウトせずに立ち去った (またはブラウザーがクラッシュした) 場合でも、セッションは存続します。

数日後、非常に多くのデッド セッションが蓄積され、サーバーがクラッシュします。

したがって、より良い解決策は、既に行っているようにユーザーを自動ログアウトし、上記のように AJAX イベント ハンドラーをインストールして、ユーザーがブラウザーに戻ったときにメッセージを表示することです

このようにして、サーバーはデッドセッションをクリーンアップでき、ユーザーはそれを読むことができるとき (画面の前にいるとき) にメッセージを受け取ります。

マウスを叩くのは、ユーザーと清掃員を区別できないことに注意してください。

于 2011-04-29T12:03:01.663 に答える