ブラウザの終了/他のページへの移動を検出してログアウトする最良の方法

StackOverflow https://stackoverflow.com/questions/888483

質問

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

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

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

役に立ちましたか?

解決

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

クロージングイベント.

を実装する必要があるようです クロージングハンドラ

他のヒント

なぜ、その後、追跡クッキーを追加し、各ページロードでリセットされて非常に短命セッションクッキーを作りません。ユーザーが戻ったとき、あなたは、トラッキングクッキーが、無セッションクッキーに気づきます。セッションの期限切れとその時点ですべてをクリアします。

これは何かのスパマーが使用されるので、

ポップアップブロッカーは、あなたのセッションを開いたときに、ブロックのonunloadウィンドウをクリーンアップできなくなります。

これは、closingイベントがどのように動作するかです。

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

するとGWTは、ユーザーにyesまたはnoと言うする機会を与えてくれます。もちろん、あなたはまた、彼らは未保存のデータを持っているか、あなたが好きかどうかを確認するためにそこにテストを追加することができます。メッセージを設定するか、何もしないヌルに設定するわけではありません。

の方法での利用 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;
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top