Лучший способ обнаружить закрытие браузера / переход на другую страницу и сделать выход - PullRequest
8 голосов
/ 20 мая 2009

Я пишу приложение в GWT, и мне нужно определить, когда пользователь покидает мое приложение или когда он закрывает окно браузера (событие onUnload), и завершить сеанс (аннулирование сеанса и несколько других задач очистки). Действие выхода из системы выполняется сервлетом.

В настоящее время я делаю это, подключаясь к событию onUnload () и открывая новое окно, указывающее на сервлет выхода из системы.

Есть ли лучший способ сделать это? Любые другие предложения приветствуются.

Ответы [ 4 ]

5 голосов
/ 20 мая 2009

Похоже, у GWT есть событие именно для этого.

ClosingEvent .

Похоже, вам нужно реализовать ClosingHandler

2 голосов
/ 20 мая 2009

Почему бы просто не создать очень короткий cookie-файл сеанса, который сбрасывается при каждой загрузке страницы, а затем добавить отслеживающий cookie-файл. Когда пользователь возвращается, вы замечаете отслеживающий cookie, но не сеансовый cookie. Завершите сеанс и все проясните на этом этапе.

Блокировщики всплывающих окон будут препятствовать очистке вашего сеанса, когда он блокирует открытое окно onUnload, потому что это то, что спаммеры используют.

1 голос
/ 10 ноября 2010

Вот как работает закрытие:

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

Тогда GWT дает пользователю возможность сказать «да» или «нет». Конечно, вы также можете добавить тест, чтобы увидеть, есть ли у них несохраненные данные или что-то еще. Если сообщение не установлено или значение NULL, ничего не делает.

0 голосов
/ 21 февраля 2013

Способ сделать это - использовать 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;
    }
}
...