Я сейчас использую Vaadin Flow версия 14 (https://github.com/vaadin/platform/releases/tag/14.0.0)
Я запускаю Java версия 1.8.0_231, 64 бит.
Я просто хочу иметь возможность обнаруживать (в java!) Всякий раз, когда пользователь выполняет одно из следующих действий:
- Закрытие текущей вкладки браузера (или его браузера)
- Кликает F5 на клавиатуре или нажимает кнопку Refre sh в браузере
- Кликает ссылку (или что-нибудь еще), которая перенаправляет их с моего сайта
I ' Мы пробовали много разных вещей, чтобы обнаружить это. Единственное, что мне удалось обнаружить, - это когда истекает текущая VaadinSession (которую я могу изменить, выполнив VaadinSession.getCurrent().getSession().setMaxInactiveInterval(15)
). Это истекает через 15 секунд после каждого сеанса (в моем случае 15 - просто число тестирования).
С Vaadin 8 , я думаю, вы можете просто сделать это и это будет работать из коробки:
JavaScript.getCurrent().execute(
"function closeListener() { catchClose(); } " +
"window.addEventListener('beforeunload', closeListener); " +
"window.addEventListener('unload', closeListener);"
);
JavaScript.getCurrent().addFunction("catchClose", arguments ->
{
System.out.println("user has quit :o");
});
Я не могу использовать это, хотя я использую Vaadin 14 , а не 8 .
Я пытался добавить это в свой класс View:
@Override
protected void onDetach(DetachEvent detachEvent)
{
System.out.println("onDetach " + detachEvent);
}
. Оно печатает это сообщение только по истечении сеанса (15 секунд в моем случае). Даже если я не закрою страницу.
Я пытался реализовать BeforeLeaveObserver / BeforeLeaveListener и переопределить это:
@Override
public void beforeLeave(BeforeLeaveEvent beforeLeaveEvent)
{
System.out.println("beforeLeave");
}
Это никогда не печатается.
Я также пробовал все это, но они не делают то, что мне нужно:
VaadinResponse.getCurrent().getService().addUIInitListener(e ->
{
System.out.println("1 addUIInitListener : " + e);
e.getUI().addBeforeLeaveListener(e2 ->
{
System.out.println("1.1 addBeforeLeaveListener : " + e2);
});
e.getUI().addDetachListener(e2 ->
{
System.out.println("1.2 addDetachListener : " + e2);
});
});
VaadinResponse.getCurrent().getService().addServiceDestroyListener(e ->
{
System.out.println("2 addServiceDestroyListener : " + e);
});
VaadinResponse.getCurrent().getService().addSessionDestroyListener(e ->
{
System.out.println("3 addSessionDestroyListener : " + e);
});
1 addUIInitListener
печатается, когда пользователь загружает страницу.
1.1 addBeforeLeaveListener
никогда печатает.
2 addServiceDestroyListener
никогда не печатает. Сервис - это не то же самое, что Сессия. Имеет смысл tho.
1.2
и 3 addSessionDestroyListener
печатные издания некоторое время спустя. Занимает 15-30 секунд.
Разве нет способа обнаружить это в основном мгновенно? : /