如何实现对用户当前正在查看的数据的锁定

时间:2011-10-05 11:07:53

标签: java jsf icefaces

早安大师,

我正在尝试实施一个解决方案,只允许我们的网络应用的一个用户能够看到他们感兴趣的数据,直到他们离开页面。

因此,当用户点击该页面时,他们会看到他们有权查看的所有路线,并且当前正在查看没有其他有权查看这些路线的人。

我已经通过创建一个Application Scoped bean来部分实现这一点,该bean存储了用户在其会话ID上键入的路径的地图。

当页面的辅助bean从数据库获取路由时,将更新Application Scoped bean。 我编写了一个Filter,当用户离开页面时,它会从Application Scoped bean中删除已查看的路径。

这一切都很好: - )

但是如果用户通过关闭浏览器选项卡/关闭浏览器或会话到期而离开页面,则会绕过我的清理代码。

有没有人有如何建议

  1. 我可以在标签/浏览器关闭/会话到期之前运行清理代码。
  2. 我可以访问应用程序范围bean中的所有用户的会话(因此我可以迭代它们并在每次请求时构建监视的路由映射)。
  3. 更好的解决方案。
  4. 我正在使用JSF / Icefaces 2。

    感谢您的时间。

3 个答案:

答案 0 :(得分:2)

首先,最重要的是,您需要决定用户关闭浏览器和释放保留对象上的锁之间的可接受延迟。

如果您可以处理锁定,直到会话被销毁,请添加HttpSessionListener并在会话销毁时执行清理。

如果您可以在10秒内处理延迟,请在网页上添加定期请求(通过AJAX / JS,或通过从服务器重新加载特定页面的隐形IFRAME),并且{{1时间戳记用户会话中的浏览器或您已有的Application Scpoed bean的最后一次访问。一个单独的线程每N秒唤醒一次,扫描具有超过M秒的锁定对象的会话并解锁它们。

如果您需要立即通知,请安装通知服务器的onbeforeunload事件处理程序。此外,您可以使用持久连接或WebSocket来执行此操作。

在任何情况下,您都需要前两个中的至少一个,因为第三个可能不可靠。

答案 1 :(得分:0)

使用cronjob或定期运行的东西并识别关闭的连接等;您可以保存每个用户的最后一个操作,并在此时间大于某个时间时删除锁定。

答案 2 :(得分:0)

您可以在页面上添加一个定期(例如每分钟一次)AJAX调用,这可以使锁定保持活动状态。