【问题标题】:JSF - detect when user has exited browser windowJSF - 检测用户何时退出浏览器窗口
【发布时间】:2011-01-27 19:04:22
【问题描述】:

在我的应用程序中,我根据用户正在查看的当前页面创建了一些锁定/解锁功能。用户可以查看一个页面并获得一个存储在我的数据库中的锁,当他们离开时,锁被释放并且数据库被更新。

我正在尝试处理用户关闭浏览器窗口而不注销的情况。他们仍将持有锁,我需要释放它并且需要进行数据库调用。

有没有办法在 JSF 应用程序中使用 Spring 或其他方法来处理这个问题?

我知道 javascript 函数 onbeforeunload,但我需要调用一个 java 方法来更新数据库。

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    unloadbeforeunload 事件在这里不会帮助您,因为规范并不能保证在这些事件中触发的任何 ajax 请求都会成功地到达服务器。通常情况下,这不会。

    最可靠的方法是保持服务器端会话的生命周期非常短,例如1 分钟并在页面上引入一个 ajax 轮询器,该轮询器每分钟(减去几秒钟)在同一会话中轮询服务器,直到用户处于非活动状态超过 实际 最大会话超时。可以通过侦听 JavaScript 键盘 (keyup) 和鼠标 (click) 事件来测试用户活动。

    【讨论】:

    • 但是如果用户退出浏览器窗口,ajax 轮询器的状态是否会丢失,因为它驻留在当前用户的会话中?如果这不是一个正确的假设,这可能是我对一切工作原理缺乏了解,非常抱歉。 @BalusC
    • 轮询器用于保持会话处于活动状态。较短的会话生命周期将导致它在最后一次轮询后 1 分钟到期。当用户关闭页面时,轮询器停止并且会话将过期。确实,有一个最长 1 分钟的间隔时间,但总比你不会得到的要好。
    • @PreDestroy 怎么样,在这种情况下会有用吗?
    【解决方案2】:

    我目前正在开发一个双窗口应用程序,需要检测窗口何时关闭。

    我的 JSF 应用程序使用 ICEfaces。它为 ViewScoped bean 提供了一个 @WindowDisposed 注释。有了这个注解,ViewScoped bean 的@PreDestroy 方法将在窗口关闭时被调用。

    我在绑定到 viewScoped bean 的页面中包含了一个 h:inputHidden 标记,这在检测窗口关闭和执行服务器端代码方面起作用。

    【讨论】:

      猜你喜欢
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 2012-06-06
      • 2015-04-02
      • 2012-02-11
      相关资源
      最近更新 更多