为什么 Tomcat 缺少内置速率限制过滤器?

Why does Tomcat lack built-in rate-limit filters?

从几个来源 (1 2 3),我得到的印象是每当人们想要对请求进行速率限制时,趋势似乎是 "wrap Tomcat behind Apache, and rate-limit on Apache"。还有 iptables 解决方案,但不会回答 HTTP 429 ("Too many requests")。

Apache 很好,但有时如果我们可以对我们拥有的小型 servlet 进行小规模部署会更好,但我们仍然被要求对请求进行速率限制,并且设置 Apache 层似乎有点矫枉过正(至少与克隆 web.xml 文件相比,我们已经在做)。

所以我正在考虑编写一个小过滤器来做到这一点(因为它看起来很不费力)并将其与 servlet 打包在一起,但令人毛骨悚然的是没有详细说明 Tomcat速率限制在开放中过滤掉表明这种方法可能是幼稚的。我的意思是,这感觉太普通了,而且现在开源的东西太多了。所以也许有一个很好的理由来证明 Apache 解决方案的合理性。 Apache has so many options 而 Tomcat 似乎有 none.

(Jetty does seem to ship with one such filter though,尽管是一个 servlet 容器。)

为什么 Tomcat 缺少内置速率限制过滤器?

Tomcat 肯定有一个 rate-limit filter valve 内置。您只需修改它以满足您的需要。

Tomcat 通常用作另一个网络服务器 (a.k.a.reverse-proxy) 后面的应用程序容器,它可以更有效地实现某些功能,例如 TLS 卸载、服务静态资源或分散负载(如负载均衡器)在多个 Java 进程或多个 Web 应用程序上,尽可能有效和尽早地阻止攻击更有意义。此外,一个 servlet 过滤器不能用于多个 Web 应用程序。

但是Tomcat有一个叫做Valves的好机制可以用来实现速率限制,完整的实现见:

https://github.com/ihbrune/Anti-DoS-Valve

不利的一面是,阀门保持 Tomcat 特定,过滤器可移植到其他 Web 容器,具体取决于您的应用程序框架,例如Spring MVC 框架可能会提供类似的选项,例如拦截器,您可以将其与库结合使用以进行速率限制,例如:

https://github.com/vladimir-bukhtoyarov/bucket4j

因此您可以编写自己的自定义逻辑,例如检查失败 次登录尝试的次数,以防撞库攻击