1

こんにちは、私は gwt-ext アプリケーションに取り組んでいます。サーバー側では Hibernate を使用しています。サーバー側でセッションを維持しています。タイムアウトは 5 分です (アクション クラスで)。

ここで、ユーザーがログインして 5 分間開いたままにするシナリオを考えてみましょう。それはサーバーコールに行きます.サーバーコールに行くとき、それはすでにセッションアウトです(セッション時間はすでに期限切れの5分であるため).そして、ログインページをリダイレクトしてセッションアウトのメッセージがポップアップしました.

この全体のケースで、ユーザーは私がシステム上でアクティブになっていると感じているため (実際にはクライアント側で 5 分後)、なぜログイン ページにリダイレクトされるのでしょうか。

背後にある理由は、そのセッションがサーバー側で維持されているためです。サーバー ヒットは 7 分後です。

そのため、クライアント側でもセッションを維持することを考えています.gwtベースのアプリケーションでこれを達成する方法. この問題を解決する他の方法はありますか。ありがとうございます。

4

4 に答える 4

4

1つの方法は、タイムアウトが発生した場合にサーバーを定期的にチェックすることです。サーバーセッションのタイムアウトを更新せずにそのチェックを実行するサーブレットメソッドを作成する必要があります。そしてもちろん、これは多くのサーバーヒットをもたらします。(ただし、必ずしも悪い方法ではありません!)


しかし、おそらく私は別のソリューションを使用します。これは、クライアント側のタイマーをサーバーのタイマーとほぼ同期させようとします。

クライアント側:

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);
    }
}

サーバーセッションのタイムアウトは、クライアントがサーバーとの対話を実行するたびに更新されると想定しています。たとえば、GWT-RPC呼び出し(セッションがまだタイムアウトしていない場合)。

したがって、クライアント側では、クライアントタイマーを更新して、ほぼ同期を維持します。

 myService.performSomeAction(...) {

     @Override
     public void onSuccess(String result) {

          ClientTimers.renewSessionTimer();

          // remaining onSuccess handling
     }

     @Override
     public void onFailure(Throwable caught) {

          if (failedBecauseOfSessionTimeout()) {

              // redirect to login

          } else {

              ClientTimers.renewSessionTimer();

              // remaining onFailure handling...
          }
     }
 }

すべてのインタラクションで(特にログイン直後に)renewSessionTimer()を呼び出すことを忘れないでください。

重要な注意:すべてのセキュリティチェックでは、サーバーセッションのみを使用してください。クライアントの「セッションタイマー」は、ユーザーにとって便利なものです。そのタイマーまたは任意の種類のクライアントセッションに依存するセキュリティ/承認チェックを行わないでください。

于 2011-04-22T09:37:07.560 に答える
1

ユーザーが画面上のボタンをクリックしたときのシナリオを考えてみましょう。サーバーをヒットさせて、セッションが有効かどうかを確認できます。

状況がわかったかどうか教えてください。

于 2011-04-22T07:50:58.263 に答える
1

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

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

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

于 2011-04-29T08:17:58.557 に答える
0

私がこれを行ったすべてのページイベントを取得してください....それは正常に機能しています。

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");
            }
        });
于 2011-04-23T05:55:38.723 に答える