【发布时间】:2012-07-11 18:12:06
【问题描述】:
我有某种聊天/论坛应用程序,它使用 jquery ajax 定期轮询(每 15 秒)检查新消息。我想知道我是否可以通过加载几个相同的浏览器实例来解决用户试图变得“有趣”的问题,这些浏览器实例有很多选项卡,都指向同一个应用程序。每个选项卡都在发送一个 ajax 请求,如果多个用户开始做同样的事情,这可能会导致服务器溢出。
我确实将会话以及上次访问时间和 IP 地址存储在一个表中,只要用户不使用相同的浏览器,它就可以正常工作。我可以存储一个使用 ajax POST 或 GET 请求发送的唯一标识符,但是如果常规(非滥用)用户刷新他的页面,这会产生问题,然后会创建一个新的标识符。
这还不是一个真正的问题,但最好在有人想到像这样滥用系统之前抓住它:) 知道如何做到这一点吗?
【问题讨论】:
-
我能想到的唯一可能做的事情是某种速率限制(即:限制每个会话/时间段的轮询请求数)。
-
嗯,这是我还没有想到的。我确实有某种限制,它会在 5 分钟不活动后停止 ajax 轮询,但我可以扩展一点。
-
实际上,使用 PHP 并不能真正做到这一点,因为这仍然需要一个 ajax 请求。是否可以使用javascript对其进行限制?换句话说,同一浏览器中的所有选项卡是否都知道彼此和彼此的请求,并通过使用 javacsript 来限制它?基本上,是否有一个内部浏览器计数器可以看到刚刚在选项卡 X 中完成了一个请求,并且在其中有代码以便选项卡 Y 不会再发送 ajax 请求?
-
JS 变量会在每次页面加载时重新实例化,因此变量不能跨选项卡共享。但是,您可以在页面加载时向服务器端脚本发送请求,该脚本会跟踪请求的数量,并在执行其他任何操作之前将其发送回客户端。
-
您能否在该用户的会话中存储上次检索消息时的时间戳?然后无论他们使用什么浏览器/选项卡,PHP 都可以检查并确保分配的时间已经过去。