网站项目怎么阻止F5刷新产生的大量重复HTTP请求?

大量的F5刷新有办法阻止吗?有些用户可能在测试中一直按F5,把项目刷死了。我们很难去限制用户不能这么做,但就因为存在这样的问题过不了客户测试那关。
而且是内网,同IP转发,几十人都用一个IP,所以应该不能用iptables阻止。
项目的页面cache也全开了,但量很大还是挡不住,项目是用drupal做的。

有没有办法判断HTTP请求,如果请求COOKIE相同时一秒内限制访问量?

以下补充一些信息:

  1. 这是内网测试,没有带宽限制

  2. 曾试过5秒内有6000次请求,但不是机器提交,因为人都去客户公司了

  3. 一直按住F5是会发出很多请求的,内网速度快,数秒上千次请求都有可能,查access log可以得到这个结论

  4. 把项目刷死的表现是8个核CPU都100%了,内存16G,最多的时候用了10G。

阅读 16.3k
26 个回答

首先从问题出发,客户都会将项目刷死,那项目上线后,如何保证稳定?

1、你的静态文件,js、CSS、图片,考虑采用本地缓存处理;
2、后端,比如Ajax请求的数据、服务端从数据库获取的数据,看问题是在应用里面(运算太复杂),还是在数据库(SQL查询不当),并考虑采用适当的缓存机制(Memcache、Redis、File)来处理;

从前端去限制用户行为,不是解决问题的办法。


先评估你的服务器能承受多大量的并发访问,有了这个数据做参考,超过这个数据量的测试,无论如何都会超出服务器承受范围,那需要考虑架构上的改变;
还要考虑测试的目的,是压力、白盒、黑盒、动态、兼容、安全测试?

你在网页上挂个木马,然后可以控制用户的计算机,然后他按刷新你就给你弹个窗口骂他。

唉,已被踩出翔,sf还是没有知乎那么有幽默感。

只能说 服务器太差,能被刷新死。。还有 貌似如果什么都不改变 有 304缓存吧

我观察过,如果不断刷新,火狐浏览器就会abort请求的,发不出去

回答问题的,基本,都,没按过F5…… 太恐怖了……

F5能刷死,一般应该是后端代码处理方面的问题。
浏览器访问都会在已放问过存在缓存的资源文件会直接返回304的,见图
图片描述

用户第一次访问时根据一些信息生成一个token,网站的所有服务都要有这个token才能访问,同时token有访问限制,对于同一服务在某个时间段内多个相同token访问,则拒绝服务。然后token进入计时器,计时器置零前,该token的所有访问都无效,计时器置零时token失效,同时生成新的token。

使用静态页面生成技术, 用户每次的请求尽量避免触发后台逻辑处理即可。

只说项目跑死了没有实际意义啊,是服务器带宽耗尽?内存耗尽?CPU耗尽?磁盘读写速度达到上限?数据库有死锁?数据库的IOPS到达上限?问这个问题之前先把项目跑死时段的服务器各项监控参数发上来,根据出问题的地方来分析问题出现的原因并寻找解决方案,才是最靠谱的!

手工刷新都能把服务器刷死,也是第一次听说。

新手上路,请多包涵

用测试工具, 一次发很多请求, 是会导致这样。nginx 的limit 也能做到

新手上路,请多包涵

关键字:RateLimit
有很多算法和解决方案

我觉得你得先找到问题,到底是哪里抗不住。

如果单单要解决刷新问题的话你可以在服务端加一个sleep函数,但是他如果通过浏览器刷新的话 最后一次肯定是要展示出来的,所以你sleep函数设置的暂停时间尽量缩短。
这些只是思路 不知道是否真的有效 你可以试试
这样的情况没遇到过

如果真的象你说的那样 那么多并发的话你这个一个机器扛不住也是正常,因为如果你业务真的能做的到的话正式环境还不用集群 分布式?

服务器iptable禁止

1.静态资源返回304;
2.动态资源设置请求频率,你们的系统应该有用户系统,基于用户识别请求频率,超过就弹验证码,例如每分钟最多刷新10次,这时候用户重复刷新消耗的资源很小;
3.部分动态资源设置缓存,不用每次都重新生成;
4.服务器负载大的时候,全部用户都返回验证码页面;
5.绝招

function DisableF5(){   
   with (event){   
           // F5 and Ctrl+R   
     if (keyCode==116 || (ctrlKey && keyCode==82)){   
       event.keyCode = 0;   
       event.cancelBubble = true;   
       return false;   
     }   
   }   
}   
  
document.onkeydown = DisableF5;   

session存一个时间啊,必须1s提交一次,超过1s就不返回数据啊。

这个有过被攻击的经历,那就不会再考虑单点了,嗯。。

可不可以js监控F5按键,记录刷新频率,

你们的后端程序员是干嘛的啊

做个 profiling 看看哪块吃了啊

我觉得前后端完全分离,利用浏览器缓存,静态文件,就不会请求服务器。数据在通过接口去拿。优化接口。。可以把接口缓存,或者静态话处理

前端请求机制加锁或者延时请求

做客户端缓存~

我觉得SyuTingSong的答案虽然有点抖机灵,但思路不错啊,比如自己写js在页面load事件记下时间戳,然后在beforeunload事件判断是否过了最小时间比如5秒,过了的话就放行,没过就弹窗提示“强撸会灰飞烟灭!”啥的

试试appcache?

宣传栏