1. 概述
Spring Boot Web 應用程序默認包含一個預配置的嵌入式 Web 服務器。然而,在某些情況下,我們可能希望修改默認配置以滿足自定義需求。
在本教程中,我們將學習如何設置和使用 <em >server.max-http-request-header-size</em> 屬性,用於在 Spring Boot 應用程序的 <em >application.properties</em> 文件中設置請求頭。
2. server.max-http-request-header-size
Spring Boot 支持 Tomcat、Undertow、Netty 和 Jetty 作為嵌入式服務器。通常,我們在 Spring Boot 應用程序的 application.properties 文件或 application.yaml 文件中編寫服務器配置。
在 Spring Boot 3 之前,我們可以通過在 properties 文件中定義 server.max-http-header-size 屬性來設置默認標題。但是,此屬性在嵌入式服務器上行為不同。當與 Tomcat 配合使用時,它配置了最大 HTTP 請求和響應標題大小。另一方面,當嵌入式服務器為 Undertwow、Netty 或 Jetty 時,它僅配置了最大 HTTP 請求標題大小。
Spring Boot 3.0 解決了這些差異,通過棄用 server.max-http-header-size 並將其替換為 server.max-http-request-header-size。 屬性現在適用於嵌入式服務器的請求標題大小。
此外,我們還可以通過實現 WebServerFactoryCustomizer 接口來配置最大響應標題。 值得注意的是,此屬性僅適用於 Tomcat 和 Jetty。
大多數 Web 服務器都有自己的 HTTP 請求標題大小限制。 服務器實現限制了 HTTP 標題值。
Tomcat 和 Jetty 的實際默認值為 8KB,Undertow 的默認值為 1MB。
要修改最大 HTTP 標題大小,我們將屬性添加到我們的 application.properties 文件中:
server.max-http-request-header-size=20000同樣適用於 application.yaml 格式:
server:
max-http-request-header-size: 20000從 Spring Boot 2.1 開始,我們將使用一個可解析的 DataSize 值:
server.max-http-request-header-size=10KB3. 請求頭過大
假設發送的請求中,總 HTTP 頭大小超過了 max-http-header-size 值。 服務器將使用“400 Bad request”錯誤拒絕該請求。 我們將在下例中在日誌文件中看到此錯誤。
讓我們創建一個控制器,該控制器具有一個名為 token 的 header 屬性:
@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-request-header-size=8KB
server.tomcat.max-swallow-size=2MB
server.tomcat.max-http-post-size=2MB當我們傳遞一個大小超過 8KB 的 String 值到 token 中時,將會收到以下 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. 解決方案
我們可以根據我們的需求,增加 max-http-request-header-size 屬性在我們的 application.properties 文件中的值。
在上述程序中,我們可以將其值從默認的 8KB 升級到 40KB,從而解決問題。
server.max-http-request-header-size=40KB
現在,服務器將處理請求並返回如下的 200 響應:
因此,當請求頭的大小超過服務器默認值時,我們將會看到服務器返回 400-Bad Request 錯誤,錯誤信息為“請求頭過大”。我們需要在應用程序配置文件中覆蓋 max-http-request-header-size 值,以匹配請求頭長度,如上述示例所示。
一般來説,請求頭可能變得過大,例如,由於加密,使用的令牌非常長。
5. 結論
在本教程中,我們學習瞭如何在 Spring Boot 應用程序的應用程序配置文件中使用 max-http-request-header-size 屬性。
然後,我們瞭解了當請求頭超出了該大小時會發生的情況,以及如何在 application.properties 中增加 max-http-request-header-size 的大小。