我有一些聊天/论坛应用程序,它使用jquery ajax使用定期轮询(每15秒)检查新消息。我想知道我是否可以通过加载几个相同的浏览器实例(包含大量选项卡)来解决那些试图“有趣”的用户问题,这些实例都指向同一个应用程序。每个选项卡都发送一个ajax请求,如果有多个用户开始做同样的事情,它可能会溢出服务器。
我会在一个表中存储会话,以及最后的访问时间和IP地址,只要用户不使用相同的浏览器,它就能正常工作。我可以存储使用ajax POST或GET请求发送的唯一标识符,但如果常规(非滥用)用户刷新其页面,则会产生问题,然后会创建新的标识符。
这还不是一个真正的问题,但是在有人想到这样滥用系统之前更好地抓住它:)不知道怎么做?
答案 0 :(得分:2)
一个选项可能是获取数据:
localStorage.setItem("last-request-timestamp", new Date().getTime());
localStorage.setItem("latest-messages", ajax_result);
localStorage.getItem("last-request-timestamp")
是否超过15秒,检查网页是否准备轮询数据。如果是,请转到步骤1.如果不是,请等待15秒再次检查。 latest-messages
变量并更新页面。其他页面当然会共享localStorage数据。如果此时正在提取另一个页面,他们将无法获取数据。如果页面#1关闭,则其他页面之一将继续获取数据。
之前我没有使用过LocalStorage,但浏览器支持看起来不错。您还应该能够将其用作键值数组:localStorage["last-request-timestamp"]
。
您只能在localStorage中存储字符串,但您当然可以将其序列化为JSON。
答案 1 :(得分:0)
我有类似的问题。现在我强制所有用户登录(这意味着我有他们的电子邮件)。另外我设置每个帐户的连接限制和每个连接的请求限制,在5次溢出后我要求用户输入验证码,然后我阻止帐户30分钟并发送带有密码恢复链接的电子邮件。这不是一个明确的解决方案,但现在它对我有用。
<强> UPD:强>
最简单的方法是使用cookie或会话存储。我用饼干。算法很简单:
microtime(true) + $delay
和mysql
decimal(14,4)
)。发送给用户在每个请求上:
microtime(true)
则意味着客户端频繁发送请求,因此决定自己该做什么,增加标记,例如microtime(true) + $delay + $penalty
或丢弃整个会话或触发错误。行为取决于您的应用程序。答案 2 :(得分:0)
不确定它是否可以在javascript中执行。您可以检查选项卡是否处于活动状态。并且只在活动标签上执行ajax?
答案 3 :(得分:0)
为什么不在问题上抛出像Memcached / Redis这样的东西?缓存10-15s生命周期的响应并避免尽可能多的处理。