java - 限制用户每秒发出有限的请求

标签 java security web-applications jakarta-ee

环境:
基于 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/

相关文章:

java - 提高同步二维阵列的性能

java - 为什么我的 RMI/SSL 客户端身份验证不起作用?

jdbc - 找不到JDBC驱动程序类:com.mysql.jdbc.Driver

java - 重新加载持久化实体

java - 使用字符串填充字符串数组? (JAVA)

php - str_replace ('<' ) 可以保护我们免受用户注入(inject)代码的侵害吗?

javascript - Yelp 鼠标跟踪机制

javascript - Angular.js Backbone.js 和其他 MV* 模式的 js 库?

java - 设计模式: multiple swing interfaces listen for thread variable

c# - 调试代码安全 .net 框架以使用 caspol.exe