Java Servlet 中限制 HTTP 请求
在 java servlet 中,如何根据客户端的 IP 地址限制来自用户的 http 请求?我不想每秒处理来自特定源 IP 地址的超过 X 个请求,其中 X 是可配置的并且具有 [0.1; 中的实际值; 10]范围(从 10 秒内 1 个请求到每秒 10 个请求)。
In a java servlet, how can I throttle http requests coming from users based on the client's IP address? I do not want to serve more than X requests per second coming from a particular source IP address where X is configurable and having practical values in [0.1; 10] range (from 1 request in 10 sec to 10 requests per sec).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
托管在 code.google.com 上的 owasp-esapi-java 项目有一个节流过滤器的实现,您可以“按原样”使用它,也可以将其用作您自己的灵感。
您可以通过以下链接查看代码:
http://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/filters/RequestRateThrottleFilter.java
The owasp-esapi-java project, hosted at code.google.com, has an implementation of a throttle filter that you can use "as is" or use as inspiration for your own.
You can check the code at the following link:
http://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/filters/RequestRateThrottleFilter.java
使用servlet过滤器:如果您使用的是Jetty 7.0或更高版本,则有这个
Use a servlet filter: if you're on Jetty 7.0 or higher there is this
我会为该任务编写一个过滤器。
I would write a Filter for that task.
正如@EJP所说,使用带有HashMap的过滤器,通过IP地址键存储上次访问时间。每秒 10 个请求将转化为调用之间至少 100 毫秒。发回服务器繁忙错误代码并终止请求将快速关闭连接使用的资源。如果您愿意的话,有针对 Apache 的预构建解决方案。
As @EJP said, using a Filter with a HashMap that stores the last access time by IP address key. 10 requests a second would translate to 100ms between calls, minimum. Sending a server busy error code back and killing the request will quickly close the resources used by the connection. There are prebuilt solutions for Apache if that's an option for you.
检查您使用的容器是否提供此类拒绝服务。如果没有,那么你就必须使用过滤器。
ServletRequest.getRemoteHost() 使您可以访问客户端 IP。
Check if the container you are using provides this kind of Denial Of Service. If no, then you would have to go with a filter.
ServletRequest.getRemoteHost() gives you access to the client IP.