1. 概述

Spring Boot Web 应用程序默认包含一个预配置的嵌入式 Web 服务器。但在某些情况下, 我们希望修改默认配置 以满足自定义要求。

在本教程中,我们将了解如何在 Spring Boot 2.x 应用程序的 application.properties 文件中设置和使用请求标头的 max-http-header-size 属性。

2. 最大 HTTP 标头大小

Spring Boot 支持TomcatUndertowJetty作为嵌入式服务器。通常,我们将服务器配置写入 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 错误,如下所示:

最大 http 标头大小为 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 响应,如下所示:

最大 HTTP 标头大小

因此,只要标头大小超过服务器列出的默认值,我们就会看到服务器返回 400-Bad 请求,并显示错误“请求标头太大”。我们必须覆盖应用程序配置文件中的 max-http-header-size 值以匹配请求标头长度,如上例所示。

一般来说,当例如由于加密而使用的令牌非常长时,请求标头可能会变得太大。

5. 结论

在本教程中,我们学习了如何在 Spring Boot 应用程序的应用程序配置文件中使用 max-http-header-size 属性。

然后,我们了解了当传递超过此大小的请求标头时会发生什么,以及如何在 application.properties 中增加 max-http-header-size 的大小。

与往常一样,这些示例的源代码可 在 GitHub 上获取。