在浏览器上触发数据库调用离开当前页面?

时间:2013-07-19 20:27:35

标签: javascript jquery jsf

我有一个应用程序,我打算在我的数据库中设置一个锁定标志,以防止其他人在设置时查看同一页面。

然而,一旦设置 - 我不知道如何“取消”它。我可以让用户取消设置标志,但这似乎没必要。

我想简单地查找浏览器离开页面,拨打数据库并解锁页面。

如何使用JSF / Javascript / jQuery(所有选项)进行“类型”(不寻找确切方式)

2 个答案:

答案 0 :(得分:2)

真的没有一种可靠的方法可以做到这一点,无论如何我已经看过了。

您可以使用浏览器的onbeforeunload事件告诉服务器,“嘿,我现在要离开页面了。”问题是您实际上无法阻止页面卸载。如果用户实际关闭了浏览器,则任何打开的套接字都将立即关闭。您的Web服务器可能会或可能不会及时收到请求。我用这种方法得到了非常不稳定的结果。

可能有效的一种方法是采用某种超时机制。该页面将每隔30秒对服务器执行一次ping操作,或者说不会,“我还在这里”。如果服务器在几分钟后没有收到此更新,则会使会话无效并释放该文档。也许这可以通过在新人出现时检查最后一次ping来优化。这样做的一个问题是,如果有人离开了页面,下一个用户可能需要等待一两分钟才能进入该页面。然后,您必须找到ping频率,不会使您的服务器充满流量,但也不会让下一个用户等待太长时间。

也可以将这两种方法结合起来。当用户离开页面时,捕获onbeforeunload事件并立即使会话无效。但是,如果它不起作用,会话将在一分钟未被ping之后超时。

有更好的解决方案吗?

如果您确实需要在Web应用中锁定文档,以便多个用户无法对其进行编辑,您可能需要调查整体设计。你是否害怕用户破坏数据?如果是这样,可以采用一种可以解决合并冲突的机制,或者检测是否可以组合这两组更改。

如果您想真正使用Web 2.0,您可以设计类似于Google Docs的内容,其中的更改会在制作时显示。无需在任何地方保存按钮!

答案 1 :(得分:0)

发送“保持活动信号”可能是一种选择。在前端一侧沿着这些线路加上会话cookie。

setInterval(function() {
  var img = new Image();
  var src = "http://examle.com/keepalive.gif?cachebuster=" + 
      Math.ceil(Math.random() * 10000 );
}, 1000);