环境:
基于 Java-EE 的 Web 应用程序
问题:
需要限制用户在同一秒内发出超过 5 个(例如)请求(主要是 BOT)
解决方案:
作为一个基本设计,我计划在应用程序范围内有 2 个同步的 Map
Map<String, Map<Long, Integer>>
String
为请求的sessionId
Long
为当前第二表示
Integer
是保存请求数
过程:
第 0 步:
配置一个过滤器
来拦截每个请求
第 1 步:
确定 map
我将查看当前 minute
是否为奇数,然后我将在 mapOne
上添加数据,然后清除 mapTwo
第 2 步:
过程图
int requestNoForThisSecond = mapXX.get(request.getSession().getId()).get(currentSecondRepresantationInLong);
if(requestNoForThisSecond <= 5){
requestNoForThisSecond++;
mapXX.get(request.getSession().getId()).put(currentSecondRepresantationInLong, requestNoForThisSecond);
}else{
response.sendRedirect();// redirect to some captcha page
}
第 4 步:
如果 session 过期/用户注销,也删除 session 条目
这是问题的非常基本的设计
你们有更好的想法/建议吗?
最佳答案
首先,我认为您应该忘记 session ID 的想法,而改用 IP 地址。您不希望机器人向您发送必要的 cookie,以便您可以跟踪其 session ,对吗?
其次,我认为您的方法不必要地复杂。您只需要一个 IP 地址到时间数组 [N] 的映射,其中 N 是一个固定数字,即您计划每秒允许的请求数。 (我假设它会相对较低。)因此,每当您收到来自给定 IP 的请求时,您将数组的内容向下移动一个,并将新请求的时间添加到数组的末尾.然后,从最后一个索引处的时间减去数组索引 0 处的时间,得到该 IP 向您发送 N 个请求所花费的时间,您可以将其简单地转换为每秒请求数。
另外,您可能会发现这个讨论很有趣:https://softwareengineering.stackexchange.com/questions/126700/development-of-a-bot-web-crawler-detection-system
关于java - 限制用户每秒发出有限的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8726857/