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

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

Вопрос

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

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

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

Это было полезно?

Решение

Похоже, у GWT действительно есть мероприятие именно для этого.

Событие закрытия.

Похоже, вам нужно реализовать Закрывающий манипулятор

Другие советы

Почему бы просто не создать очень недолговечный файл 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;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top