多个浏览器窗口打开时如何防止多个ajax请求

时间:2010-10-15 17:26:16

标签: javascript ajax

我一直致力于在网站上设置即时通讯系统(有点像Facebook和Gmail)。我有javascript轮询服务器的新消息。

如果用户有多个网站实例打开,有没有办法阻止每个人提出请求?

3 个答案:

答案 0 :(得分:4)

您可以使用UUID分配页面的每个“新”加载,并从所有不是最新用户的UUID中删除请求。您需要在每个请求中发回UUID。如果你想获得高级,你可以让页面上的JavaScript检查响应,看看服务器是否说它是旧的UUID,并且它应该停止发出请求。

答案 1 :(得分:3)

使用浏览器中即时生成的GUID注册每个连接。检查GUID和用户名对,以查看最后一个页面的所有者。在页面加载时,声明自己一个新窗口,并且您正在获得所有权。排序PageJustLoadedMakeMeOwner(myGuid, username)

然后让GUID目标框架定期更新服务器以获取页面的所有权。

如果它停止更新服务器,则在服务器中设置允许下一页联系的规则以获取该用户名的所有权。

将失去所有权的网页自我降级为仅每分钟访问一次。

检查给定页面是否是该用户名的所有者的响应非常快。就客户所知,几乎没时间做。所以AJAX并没有真正限制你。

AmIOwner(username, myGuid)检查的排序(可能每隔五秒左右执行一次)。如果是真的,那么做你想要发生的事情。如果为false,则轮询以查看页面所有者是否空缺。如果是,则取得所有权。如果为false,则以xx秒数再次轮询以查看所有者是否空缺。

这有什么意义吗?

答案 2 :(得分:1)

您可以在同一个浏览器中为多个实例执行某些操作,但如果用户有多个浏览器,则无法执行任何操作。 (当然,不是那种常见的情况)

如果您仍想尝试一下,可能最简单的方法是在cookie中保留最后一个请求的时间戳,并仅在某个阈值时发出新请求。在多个实例稳定下来之前,您仍然可能会运行一个小型竞赛,但如果您使用模糊时间段进行轮询,则实例应该很快稳定到一个稳定状态,其中一个实例发出呼叫而其他实例重用最后一次通话的结果。

该方法的主要优点是可以由任何实例发出请求,因此您不必担心协商进行调用的“主要”实例并在用户关闭时计算回退算法“主要的”。主要的缺点是,由于它是基于模糊定时的算法,它不能完全消除竞争条件,偶尔你会有两个实例发出请求。你必须稍微调整一下时间,以尽量减少这种情况,但你无法完全阻止它。