1. 概述
Spring Boot Web 应用程序默认包含一个预配置的嵌入式 Web 服务器。但在某些情况下, 我们希望修改默认配置 以满足自定义要求。
在本教程中,我们将了解如何在 Spring Boot 2.x 应用程序的 application.properties 文件中设置和使用请求标头的 max-http-header-size 属性。
2. 最大 HTTP 标头大小
Spring Boot 支持Tomcat 、 Undertow和Jetty作为嵌入式服务器。通常,我们将服务器配置写入 Spring Boot 应用程序中的 application.properties 文件或 application.yaml 文件中。
大多数 Web 服务器对 HTTP 请求标头都有自己的一组大小限制。 HTTP 标头值受服务器实现的限制。在 Spring Boot 应用程序中,最大 HTTP 标头大小是使用 server.max-http-header-size 配置的。
Tomcat 和 Jetty 的实际默认值为 8kB,Undertow 的默认值为 1MB。
要修改最大 HTTP 标头大小,我们将该属性添加到 application.properties 文件中:
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”错误 。我们将在下一个示例的日志文件中看到此错误。
让我们创建一个控制器,它有一个名为 token 的标头属性:
@RestController
@RequestMapping(value = "/request-header-test")
public class MaxHttpHeaderSizeController {
@GetMapping
public boolean testMaxHTTPHeaderSize(@RequestHeader(value = "token") String token) {
return true;
}
}
接下来,让我们向 application.properties 文件添加一些属性:
## Server connections configuration
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
当我们在 token 中传递一个大小大于 8kb 的 String 值时,我们将得到 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、解决方案
我们可以根据我们的要求增加 application.properties 文件中 max-http-header-size 属性的值。
在上面的程序中,我们可以将其值从默认的8kb升级到40KB,这样就可以解决问题。
server.max-http-header-size=40KB
现在,服务器将处理该请求并发回 200 响应,如下所示:
因此,只要标头大小超过服务器列出的默认值,我们就会看到服务器返回 400-Bad 请求,并显示错误“请求标头太大”。我们必须覆盖应用程序配置文件中的 max-http-header-size 值以匹配请求标头长度,如上例所示。
一般来说,当例如由于加密而使用的令牌非常长时,请求标头可能会变得太大。
5. 结论
在本教程中,我们学习了如何在 Spring Boot 应用程序的应用程序配置文件中使用 max-http-header-size 属性。
然后,我们了解了当传递超过此大小的请求标头时会发生什么,以及如何在 application.properties 中增加 max-http-header-size 的大小。
与往常一样,这些示例的源代码可 在 GitHub 上获取。