Вопрос по onunload, javascript, gwt, logout – Лучший способ обнаружить закрытие браузера / переход на другую страницу и сделать выход

8

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

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

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

Дубликат этого вопроса.stackoverflow.com/questions/875380/... Marc W
Ответ действительно отвечает на этот вопрос - вы не можете сказать, когда пользователь прекратил пользоваться вашим сайтом. Самое близкое, что вы можете сделать, это сообщить, когда пользователь не отправил новый запрос на сайт в течение определенного периода времени. Quentin
Этот вопрос не является дубликатом этого. Bjorn Tipling

Ваш Ответ

4   ответа
2

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

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

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;
    }
}
1

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

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

5

ClosingEvent.

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

Мне известен этот WindowCloseListener (эквивалент ClosingEvent в GWT 1.5), но я предполагал, что, поскольку объект RequestCallback является обязательным для выполнения запроса, это может вызвать некоторые проблемы в событиях обратного вызова. Но я пытался с RequestCallback ничего не делать на событие onResponseReceived, и он работает нормально. Спасибо за ответ. Saravanan M
Именно такие ответы и объясняют, почему нельзя разрешать только ссылки на информацию. Оба из них сломаны. Jorden
Я только что провел быстрый тест для создания ClosingHandler и зарегистрировал его. Я сделал простой, который просто отображает предупреждение. Код срабатывает, когда вкладка / окно закрыта, а также когда я перехожу на другую страницу за пределами приложения. Carnell
Вы должны иметь возможность отправить один последний запрос на выход из системы на ваш сервер в вашем обработчике. Carnell

Похожие вопросы