我有一个应用程序,我打算在我的数据库中设置一个锁定标志,如果设置,它将排除其他人查看同一页面。
但是,一旦设置 - 我不知道如何“取消设置”它。我可以让用户取消设置标志,但这似乎没有必要。
我只想寻找浏览器离开页面,调用数据库,然后解锁页面。
一个人如何使用 JSF/Javascript/jQuery(所有选项)做这种“类型”(不寻找确切的方式)
我有一个应用程序,我打算在我的数据库中设置一个锁定标志,如果设置,它将排除其他人查看同一页面。
但是,一旦设置 - 我不知道如何“取消设置”它。我可以让用户取消设置标志,但这似乎没有必要。
我只想寻找浏览器离开页面,调用数据库,然后解锁页面。
一个人如何使用 JSF/Javascript/jQuery(所有选项)做这种“类型”(不寻找确切的方式)
确实没有可靠的方法来做到这一点,无论如何我都见过。
您可以使用浏览器的onbeforeunload
事件告诉服务器,“嘿,我现在要离开页面了。”。问题是您实际上无法阻止页面卸载。如果用户实际上正在关闭浏览器,则任何打开的套接字都将立即关闭。您的网络服务器可能会也可能不会及时收到请求。我用这种方法得到了非常不稳定的结果。
一种可能有效的方法是采用某种超时机制。该页面会每隔 30 秒或其他时间 ping 服务器一次,说“我还在这里”。如果服务器在几分钟后没有收到此更新,它将使会话无效并释放该文档。也许这可以通过在有新人出现时检查最后一次 ping 来优化。这样做的一个问题是,如果有人离开了页面,下一个用户可能需要等待一两分钟才能转到该页面。然后,您必须找到一个不会使您的服务器充满流量的 ping 频率,但也不会使下一个用户不得不等待太久。
也可以将这两种方法结合起来。当用户离开页面时,捕获onbeforeunload
事件并立即使会话无效。但是,如果它不起作用,会话将在没有被 ping 的一分钟后超时。
有更好的解决方案吗?
如果您确实需要在 Web 应用程序中锁定文档以使多个用户无法编辑它,您可能需要调查您的整体设计。你害怕用户破坏数据吗?如果是这样,可能会采用一种可以解决合并冲突的机制,或者检测两组更改是否可以合并。
如果您想真正实现 Web 2.0,您可以设计类似于 Google Docs 的东西,其中的更改会在更改时实时显示。任何地方都不需要保存按钮!
Sending a "keep-alive signal" might be an option. Something along these lines on the frontend side, combined with session cookies.
setInterval(function() {
var img = new Image();
var src = "http://examle.com/keepalive.gif?cachebuster=" +
Math.ceil(Math.random() * 10000 );
}, 1000);