Перейти к основному содержимому

Max-HTTP-Header-Size в Spring Boot 2

· 3 мин. чтения

1. Обзор

Веб-приложения Spring Boot по умолчанию включают предварительно настроенный встроенный веб-сервер. Однако в некоторых ситуациях мы хотели бы изменить конфигурацию по умолчанию, чтобы она соответствовала индивидуальным требованиям.

В этом руководстве мы увидим, как установить и использовать свойство max-http-header-size для заголовков запросов в файле application.properties в приложении Spring Boot 2.x.

2. Максимальный размер HTTP-заголовка

Spring Boot поддерживает Tomcat , Undertow и Jetty в качестве встроенных серверов. Как правило, мы записываем конфигурации сервера в файл application.properties или файл application.yaml в приложении Spring Boot.

Большинство веб-серверов имеют собственный набор ограничений на размер заголовков HTTP-запросов. Значения заголовка HTTP ограничены реализациями сервера. В приложении Spring Boot максимальный размер заголовка HTTP настраивается с помощью server.max-http-header-size .

Фактическое значение по умолчанию для Tomcat и Jetty — 8 КБ, а значение по умолчанию для Undertow — 1 МБ.

Чтобы изменить максимальный размер заголовка 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

Когда мы передаем в токен строковое значение, размер которого превышает 8 КБ, мы получим ошибку 400, как показано ниже:

./c2bbc3d008796c6d2105beb8bb976086.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. Решение

Мы можем увеличить значение свойства max-http-header-size в нашем файле application.properties в соответствии с нашими требованиями.

В приведенной выше программе мы можем обновить его значение с 8 КБ по умолчанию до 40 КБ, что решит проблему.

server.max-http-header-size=40KB

Теперь сервер обработает запрос и отправит ответ 200, как показано ниже:

./bfdd8ec948a87128f7a2c253cc090e83.png

Следовательно, всякий раз, когда размер заголовка превышает значения по умолчанию, указанные сервером, мы увидим, что сервер возвращает 400-Bad Request с ошибкой «заголовок запроса слишком велик». Мы должны переопределить значение max-http-header-size в файле конфигурации приложения, чтобы оно соответствовало длине заголовка запроса, как мы видим в приведенном выше примере.

Как правило, заголовок запроса может стать слишком большим, если, например, используемый токен слишком длинный из-за шифрования.

5. Вывод

В этом руководстве мы узнали, как использовать свойство max-http-header-size в файлах конфигурации нашего приложения Spring Boot.

Затем мы увидели, что происходит, когда мы передаем заголовок запроса, превышающий этот размер, и как увеличить размер max-http-header-size в нашем application.properties .

Как всегда, исходный код этих примеров доступен на GitHub .