我目前正在使用Vaadin 流版本 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 在我的例子中只是一个测试数字)。
With 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");
});
我不能使用这个,因为我使用瓦丁14, not 8.
我尝试将其添加到我的 View 类中:
@Override
protected void onDetach(DetachEvent detachEvent)
{
System.out.println("onDetach " + detachEvent);
}
它仅在会话过期时打印此消息(在我的例子中为 15 秒)。即使我不关闭页面。
我尝试过实施离开前观察者 / 离开前监听器并覆盖这个:
@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
and 3 addSessionDestroyListener
稍后打印。大约需要 15-30 秒。
有没有办法基本上立即检测到这一点? :/