私はGWTでアプリケーションを作成していますが、ユーザーがアプリケーションから移動したとき、またはブラウザーウィンドウを閉じてログアウトしたとき(セッションの無効化とその他のいくつかのクリーンアップタスク)を検出する必要があります。ログアウトアクションはサーブレットによって実行されます。
現在、onUnload()イベントにフックして、ログアウトサーブレットを指す新しいウィンドウを開くことでこれを行っています。
これを行うためのより良い方法はありますか?他の提案は大歓迎です。
私はGWTでアプリケーションを作成していますが、ユーザーがアプリケーションから移動したとき、またはブラウザーウィンドウを閉じてログアウトしたとき(セッションの無効化とその他のいくつかのクリーンアップタスク)を検出する必要があります。ログアウトアクションはサーブレットによって実行されます。
現在、onUnload()イベントにフックして、ログアウトサーブレットを指す新しいウィンドウを開くことでこれを行っています。
これを行うためのより良い方法はありますか?他の提案は大歓迎です。
ページが読み込まれるたびにリセットされる非常に短期間のセッションCookieを作成してから、トラッキングCookieを追加してみませんか。ユーザーが戻ると、トラッキングCookieは表示されますが、セッションCookieは表示されません。セッションを終了し、その時点ですべてをクリアします。
ポップアップブロッカーは、スパマーが使用するものであるため、onUnloadウィンドウのオープンをブロックするときにセッションのクリーンアップを防ぎます。
クロージングイベントの仕組みは次のとおりです。
Window.addWindowClosingHandler(new Window.ClosingHandler()
{
@Override
public void onWindowClosing(ClosingEvent event)
{
event.setMessage("Are you sure?");
}
});
次に、GWTはユーザーに「はい」または「いいえ」と言う機会を与えます。もちろん、そこにテストを追加して、保存されていないデータや必要なものがあるかどうかを確認することもできます。メッセージを設定しない、またはnullに設定しても、何も起こりません。
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;
}
}