【发布时间】:2012-02-02 08:29:39
【问题描述】:
环境:
基于 Java-EE 的 Web 应用程序
问题:
需要限制用户在同一秒内发出超过 5 个(例如)请求(主要是 BOT)
解决方案:
作为基本设计,我计划在应用程序范围内有 2 个同步 Map
Map<String, Map<Long, Integer>>
String 用于请求的 sessionId
Long 用于当前的第二个表示
Integer 是保持请求计数
流程:
第 0 步:
配置Filter 拦截每个请求
第 1 步:
确定地图
我会看看当前的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 步:
如果会话过期/用户注销,也会删除会话条目
这是针对问题的非常基本的设计
你们中的任何人有更好的想法/建议吗?
【问题讨论】:
-
我认为这个问题与 Java 或 Java-ee 没有任何关系。不?我的意思是,这是关于一种方法的讨论,并且与语言无关。如果您希望我们实际检查您的代码,那么合适的站点是 CodeReview.StackExchange.com
-
对会话 ID 的每秒有限请求或对用户每秒的有限请求,他可以在不同的浏览器中打开许多会话。
-
@jigar ok,用geolite ip地址数据库和java api怎么样。blog.anthonychaves.net/2006/07/14/…
-
如果只针对机器人,你考虑过
robots.txt中的Crawl-delay指令吗?有了它,您可以指定机器人在连续请求之间必须等待的秒数。每分钟 5 次,即为Crawl-Delay: 12。诚然,并非所有机器人都遵守它(本土/水蛭等),但像 Googlebot 这样自尊的机器人却如此。
标签: java security web-applications jakarta-ee