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, как показано ниже:
И в журнале мы видим следующую ошибку:
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, как показано ниже:
Следовательно, всякий раз, когда размер заголовка превышает значения по умолчанию, указанные сервером, мы увидим, что сервер возвращает 400-Bad Request с ошибкой «заголовок запроса слишком велик». Мы должны переопределить значение max-http-header-size
в файле конфигурации приложения, чтобы оно соответствовало длине заголовка запроса, как мы видим в приведенном выше примере.
Как правило, заголовок запроса может стать слишком большим, если, например, используемый токен слишком длинный из-за шифрования.
5. Вывод
В этом руководстве мы узнали, как использовать свойство max-http-header-size
в файлах конфигурации нашего приложения Spring Boot.
Затем мы увидели, что происходит, когда мы передаем заголовок запроса, превышающий этот размер, и как увеличить размер max-http-header-size
в нашем application.properties
.
Как всегда, исходный код этих примеров доступен на GitHub .