8

私はGWTでアプリケーションを作成していますが、ユーザーがアプリケーションから移動したとき、またはブラウザーウィンドウを閉じてログアウトしたとき(セッションの無効化とその他のいくつかのクリーンアップタスク)を検出する必要があります。ログアウトアクションはサーブレットによって実行されます。

現在、onUnload()イベントにフックして、ログアウトサーブレットを指す新しいウィンドウを開くことでこれを行っています。

これを行うためのより良い方法はありますか?他の提案は大歓迎です。

4

4 に答える 4

5

GWTにはまさにこのためのイベントがあるようです。

ClosingEvent

ClosingHandlerを実装する必要があるようです

于 2009-05-20T15:40:39.157 に答える
2

ページが読み込まれるたびにリセットされる非常に短期間のセッションCookieを作成してから、トラッキングCookieを追加してみませんか。ユーザーが戻ると、トラッキングCookieは表示されますが、セッションCookieは表示されません。セッションを終了し、その時点ですべてをクリアします。

ポップアップブロッカーは、スパマーが使用するものであるため、onUnloadウィンドウのオープンをブロックするときにセッションのクリーンアップを防ぎます。

于 2009-05-20T15:04:59.337 に答える
1

クロージングイベントの仕組みは次のとおりです。

Window.addWindowClosingHandler(new Window.ClosingHandler()
{
 @Override
 public void onWindowClosing(ClosingEvent event)
 {
  event.setMessage("Are you sure?");
 }
});

次に、GWTはユーザーに「はい」または「いいえ」と言う機会を与えます。もちろん、そこにテストを追加して、保存されていないデータや必要なものがあるかどうかを確認することもできます。メッセージを設定しない、またはnullに設定しても、何も起こりません。

于 2010-11-09T22:56:13.690 に答える
0

Window.addWindowClosingHandlerそのための方法は、@Carnellや@BillLyonsが言ったようなものを使用することです。ただし、追加の手法を使用して、ブラウザーが閉じられているかどうか、またはページが再度アクセスされているかどうかを検出します(更新または戻るナビゲーションによって)。

続いて、あなたを助けることができるユーティリティクラスがあります。onModuleLoadテストするには、以下の行を呼び出してください。

使用例

@Override
public void onModuleLoad() {
    if (BrowserCloseDetector.get().wasClosed()) {
        GWT.log("Browser was closed.");
    }
    else {
        GWT.log("Refreshing or returning from another page.");
    }
}

ユーティリティクラス

import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;

public class BrowserCloseDetector {
    private static final String COOKIE = "detector";
    private static BrowserCloseDetector instance;

    private BrowserCloseDetector() {
        Window.addWindowClosingHandler(new Window.ClosingHandler() {
            public void onWindowClosing(Window.ClosingEvent closingEvent) {
                Cookies.setCookie(COOKIE, "");
            }
        });
    }

    public static BrowserCloseDetector get() {
        return (instance == null) ? instance = new BrowserCloseDetector() : instance;
    }

    public boolean wasClosed() {
        return Cookies.getCookie(COOKIE) == null;
    }
}
于 2013-02-21T00:28:01.743 に答える