Jsf 在iOS上卸载页面时在Omnifaces@ViewScoped bean上调用@PreDestroy
我正在Tomcat9容器中使用JSF2.3.9(Mojarra)和OmniFaces3.4开发一个web应用程序。在一个页面上,我显示了来自Jsf 在iOS上卸载页面时在Omnifaces@ViewScoped bean上调用@PreDestroy,jsf,omnifaces,Jsf,Omnifaces,我正在Tomcat9容器中使用JSF2.3.9(Mojarra)和OmniFaces3.4开发一个web应用程序。在一个页面上,我显示了来自org.omnifaces.cdi.ViewScopedbean的信息。此bean正在@PostConstruct中分配资源,并且应在用户通过调用@PreDestroy方法导航到其他页面时立即释放这些资源 这在OsX上的Safari、Firefox和Chrome等浏览器上运行良好。但是当在iOS上从Safari启动web应用程序时,不会调用@PreDestr
org.omnifaces.cdi.ViewScoped
bean的信息。此bean正在@PostConstruct
中分配资源,并且应在用户通过调用@PreDestroy
方法导航到其他页面时立即释放这些资源
这在OsX上的Safari、Firefox和Chrome等浏览器上运行良好。但是当在iOS上从Safari启动web应用程序时,不会调用@PreDestroy
方法,例如当页面离开时。
在我看来,之所以会发生这种情况,是因为正如我所看到的那样,Omnifaces的脚本unload.js
绑定到了这个事件
忘了提及-它是最新的iOS版本13.2.3
有人知道如何解决这个问题吗?从技术上讲,这是一个全方位的错误。它实际上从未考虑过<代码>预卸载< /代码>还是<代码>卸载< /COD>事件实际上是被支持的。它也从未检查
pagehide
事件
它在OmniFaces 3.4.1(和2.7.3)中报告并已修复
基本上,检查是从
var unloadEvent = window.onbeforeunload ? "unload" : "beforeunload";
到
它将首先检查
pagehide
是否通过在窗口中测试“onpagehide”得到了实际支持,如果不支持,则在卸载前对执行同样的操作,同时检查是否没有(遗留)自定义处理程序,否则返回到unload
我认为不应该严格依赖于调用的析构函数。你为什么需要清理?如果用户打开了多个选项卡或者只是关闭了他们的浏览器怎么办?从技术上讲,这是OmniFaces中的一个bug。@Selaron我完全同意你关于释放资源时依赖析构函数的观点。但我需要这种清理,因为ViewScope服务器Bean将数据从网络设备流到JavaScript客户端实现。当用户离开页面时,bean应该关闭资源。由于bean是ViewScope的,所以多个选项卡是没有问题的。我在OmniFaces中创建了这个问题。您可以试试3.4.1-SNAPSHOT看看它是否适合您吗?
var unloadEvent = ("onpagehide" in window) ? "pagehide"
: ("onbeforeunload" in window && !window.onbeforeunload) ? "beforeunload" : "unload";