Spring Boot 中的 Max-HTTP-Header-Size

1、概览

Spring Boot Web 应用默认包含一个预配置的嵌入式 Web 服务器。有时候需要对这个服务器进行一些定制来满足特殊的需求。

本文将会带你了解如何在 Spring Boot 应用中通过 max-http-header-size 配置属性来限制客户端的 Header 大小。

2、Max-HTTP-Header-Size

Spring Boot 支持将 TomcatUndertowJetty 作为嵌入式服务器。通常,会在 Spring Boot 应用的 application.properties 文件或 application.yaml 文件中定义服务器配置。

大多数 Web 服务器对 HTTP 请求头有自己的大小限制。HTTP 请求头的值受服务器实现的限制。在 Spring Boot 应用中,可以使用 server.max-http-header-size 配置属性来配置最大允许的 HTTP Header 的大小

Tomcat 和 Jetty 的默认值为 8kB,而 Undertow 的默认值为 1MB。

application.properties 文件中添加该属性,修改最大 HTTP Header 大小:

server.max-http-header-size=20000

同样,application.yaml 格式也是如此:

server:
    max-http-header-size: 20000

从 Spring Boot 2.1 开始,可以使用 DataSize 格式的值:

server.max-http-header-size=10KB

3、请求头过大

假设在客户端发送的请求中,HTTP 请求头的总大小大于 max-http-header-size 值。服务器会拒绝该请求,返回 “400 Bad request” 错误。

创建一个 Controller,接受一个名为 token 的请求头:

@RestController
@RequestMapping(value = "/request-header-test")
public class MaxHttpHeaderSizeController {
    @GetMapping
        public boolean testMaxHTTPHeaderSize(@RequestHeader(value = "token") String token) {
        return true;
    }
}

接下来,在 application.properties 文件中添加一些属性:

## 服务器的连接配置
server.tomcat.threads.max=200
server.connection-timeout=5s
server.max-http-header-size=8KB
server.tomcat.max-swallow-size=2MB
server.tomcat.max-http-post-size=2MB

当在 Header 中传递的 token 字符串大小超过 8kb 时,就会返回如下 400 错误:

“request header is too large” 响应

可以在服务器控制台看到如下日志:

19:41:50.757 [http-nio-8080-exec-7] INFO  o.a.coyote.http11.Http11Processor - Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Request header is too large
...

4、解决办法

可以根据自己的需要,修改 application.properties 文件max-http-header-size 属性的值。

例如,可以将其值从默认的 8kb 提升到 40KB:

server.max-http-header-size=40KB

重启服务,再次发起请求。这次服务器返回 200 OK。

响应 200 OK

因此,只要请求头的大小超过服务器的默认值,服务器就会返回 “400 Bad Request”,并提示错误 “request header is too large”。可以通过修改应用配置文件中的 max-http-header-size 值,使其与请求头长度相匹配,来解决这个问题。如上例所示。

一般来说,当使用 Header 传递 JWT、或者加密后的密文时,请求头可能会变得过大。

5、Spring Boot 3

从 Spring Boot 3 开始,为了语义更加的清晰,max-http-header-size 属性被改为了 server.max-http-request-header-size。表示专门用于限制 “请求头” 的大小。

server.max-http-request-header-size=8KB

更多关于服务器的配置信息,可以参考 中文文档

6、总结

本文介绍了如何在 Spring Boot 的配置文件中使用 max-http-header-size 属性来限制客户端请求头的大小。以及该属性在 Spring Boot 3 中的变化。


Ref:https://www.baeldung.com/spring-boot-max-http-header-size