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

标签 java jsf icefaces

早上好,

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

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

我通过创建一个应用程序范围的 bean 来部分实现这一点,该 bean 存储用户通过其 session ID 查看的路线图。

当页面的支持 bean 从数据库获取路由时,应用程序范围 bean 就会更新。 我编写了一个过滤器,当用户离开页面时,它会从应用程序范围 bean 中删除查看的路由。

这一切都很好:-)

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

有人有建议吗

  1. 我可以在选项卡/浏览器关闭/ session 过期之前运行清理代码。
  2. 我可以访问应用程序范围 bean 中所有用户的 session (这样我就可以迭代它们并在每次请求时构建监视的路线图)
  3. 更好的解决方案的想法。

我正在使用 JSF/Icefaces 2。

感谢您的宝贵时间。

最佳答案

首先,也是最重要的一点,您需要确定用户关闭浏览器和释放所持有对象的锁定之间可接受的延迟。

如果您可以处理在 session 被销毁之前保持锁定的情况,请添加一个 HttpSessionListener 并在 session 被销毁时执行清理。

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

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

无论如何,您至少需要前两个中的一个,因为第三个可能不可靠。

关于java - 如何实现对用户当前正在查看的数据的锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7660354/

相关文章:

java - JAX-WS 和 Spring 运行时建模器错误

java - 单击 anchor 标记时执行 JSTL 条件

java - 从字符串到 float 的奇怪转换

jsf - ajax 渲染后 commandButton 处于非事件状态

java - 从 ICEFaces 中的数据库数据动态构建 xhtml

java - 读取签名文件后无法验证签名

jsf - jsf中的 session 注销问题

java - 在 JSF 中借助 Ajax 动态生成的命令按钮根本不起作用

java - Icefaces 的默认外观以及如何自定义它

datatable - 冰面王牌 :dataTable lazy loading