1、概览 {#1概览}
Spring Boot Web 应用默认包含一个预配置的嵌入式 Web 服务器。有时候需要对这个服务器进行一些定制来满足特殊的需求。
本文将会带你了解如何在 Spring Boot 应用中通过 max-http-header-size
配置属性来限制客户端的 Header 大小。
2、Max-HTTP-Header-Size {#2max-http-header-size}
Spring Boot 支持将 Tomcat 、Undertow 和 Jetty 作为嵌入式服务器。通常,会在 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、请求头过大 {#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 错误:
可以在服务器控制台看到如下日志:
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、解决办法 {#4解决办法}
可以根据自己的需要,修改 application.properties
文件max-http-header-size
属性的值。
例如,可以将其值从默认的 8kb 提升到 40KB:
server.max-http-header-size=40KB
重启服务,再次发起请求。这次服务器返回 200 OK。
因此,只要请求头的大小超过服务器的默认值,服务器就会返回 "400 Bad Request",并提示错误 "request header is too large"。可以通过修改应用配置文件中的 max-http-header-size
值,使其与请求头长度相匹配,来解决这个问题。如上例所示。
一般来说,当使用 Header 传递 JWT、或者加密后的密文时,请求头可能会变得过大。
5、Spring Boot 3 {#5spring-boot-3}
从 Spring Boot 3 开始,为了语义更加的清晰,max-http-header-size
属性被改为了 server.max-http-request-header-size
。表示专门用于限制 "请求头" 的大小。
server.max-http-request-header-size=8KB
更多关于服务器的配置信息,可以参考 中文文档。
6、总结 {#6总结}
本文介绍了如何在 Spring Boot 的配置文件中使用 max-http-header-size
属性来限制客户端请求头的大小。以及该属性在 Spring Boot 3 中的变化。
Ref:https://www.baeldung.com/spring-boot-max-http-header-size