Spring MVC / Tomcat 上有许多并发请求的异常 403 行为

Unusual 403 behaviour on Spring MVC / Tomcat with many simultaneous requests

我有一个 Spring 4.2.3 MVC 应用程序,其中包含 Hibernate、Jackson 和一长串其他库,这些库仅在一台服务器上表现出奇怪的行为,而其他四五台服务器的行为几乎相同一般。该应用程序在 Tomcat 7 Java 8.

中运行

@RestController 控制器使用 @PreAuthorize 授权每个请求到端点。当用户缺少请求 returns 403(禁止)响应所需的权限时,使会话无效,并且所有后续请求 return 401(未授权)直到该用户再次进行身份验证。

当用户拥有所有必需的权限时,问题服务器自发地 returns 403s。当用户缺少权限时,我们的权限评估程序会记录下来,在这种情况下,它不会记录任何内容(包括无例外情况)。服务器 return 有多个 403 响应,而不仅仅是一个后跟 401。此外,403 响应是默认的 Apache / Tomcat 输出,而我们将 Spring 配置为 return 一个基本的 HTML 页面,其 403 用于用户将看到它的遗留场景.所有这些让我认为问题存在于 Spring 应用程序之外,也许在 Tomcat.

在某些情况下,客户端可以向同一个端点发送大量 HTTP 请求 - 最多 42 个。我看到前 30 个左右 return 200 OK,接下来的 12 个全部 return 403。我能够抑制自发 403 的唯一方法是将 42 合并为四个 HTTP 请求。不管问题如何,这种整合都是一件好事,但我想了解这里的工作机制。如果我不知道服务器可以处理多少请求的限制,那么我将永远无法信任它。

到目前为止我的想法是:

  1. 一些内置的 DOS 保护决定我有太多的同时请求并以最少资源密集的方式响应
  2. Tomcat 达到线程限制并以不希望的方式做出反应

在多台服务器中的一台服务器上可能导致此行为的原因是什么?

问题是 Apache 的 mod_evasive 模块。问题服务器配置了 DoS / DDoS 保护,因为它可以从外部访问。 mod_evasive 的存在是为了提供这种确切的行为 - 如果 Apache 根据其配置收到太多请求,它 returns 403 响应作为低资源快捷方式。