我目前正在使用Vaadin Flow 版本 14 ( https://github.com/vaadin/platform/releases/tag/14.0.0 )
我运行 Java 版本 1.8.0_231,64 位。
我只是希望能够在用户执行以下任一操作时检测到(在 java 中!):
- 关闭当前浏览器选项卡(或其浏览器)
- 在他们的键盘上点击 F5,或者在他们的浏览器中按下刷新按钮
- 单击链接(或其他任何内容),将它们从我的网站重定向
我已经尝试了很多不同的方法来检测这一点。到目前为止,我唯一能检测到的是当前 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
从不打印。服务与会话不同。有道理。
1.2
并3 addSessionDestroyListener
在一段时间后打印。需要15-30秒。
有没有办法基本上立即检测到这一点?:/