Contents

在Spring Boot 2中Max-Http-Header-Size属性

1.概述

Spring Boot Web 应用程序默认包含一个预配置的嵌入式 Web 服务器。但是,在某些情况下,我们希望修改默认配置以满足自定义要求。 在本教程中,我们将了解如何在 Spring Boot 2.x 应用程序的application.properties文件中为请求标头设置和使用max-http-header-size属性。

2. Max-HTTP-Header-Size

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

当我们在令牌中传递一个大小大于 8kb的字符串值时,我们将得到 400 错误,如下所示: /uploads/spring_boot_max_http_header_size/01.png 在日志中,我们看到以下错误:

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 响应,如下所示: /uploads/spring_boot_max_http_header_size/02.png

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

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