Spring Boot cung cấp các cấu hình mặc định và nhúng web server cho phép chúng ta có thể xây dựng ứng dụng một cách nhanh chóng. Tuy nhiên trong một số trường hợp chúng ta cần phải chỉnh sửa các cấu hình mặc định này sao cho phù hợp với yêu cầu.
Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu cách tùy chỉnh thuộc tính max-http-header-size cho các request headers trong file cấu hình application.properties hay application.yml trong Spring 2.0.
Max-HTTP-Header-Size
Spring Boot hiện tại hỗ trợ nhúng Tomcat, Undertow, và Jetty server, chúng ta có thể cấu hình cho server của mình bằng cách chỉnh sửa trong application.properties hoặc application.yml tùy vào định dạng mà project các bạn đang sử dụng.
Hầu hết các web server đều cho phép điều chỉnh kích thước tối đa của HTTP Header, trong Spring Boot 2.0 chúng ta có thể cấu hình giá trị này bằng thuộc tính server.max-http-header-size.
Giá trị mặc định cho Tomcat và Jetty là 8kB và giá trị mặc định cho Undertow là 1MB. Chúng ta có thể chỉnh sửa giá trị này bằng cách chỉnh application.properties như sau:
server.max-http-header-size=20000
Tương tự với application.yml
server: max-http-header-size: 20000
Từ Spring Boot 2.1 chúng ta có thể chỉ định đơn vị đi kèm.
server.max-http-header-size=10KB
Request Header Is Too Large
Giả sử chúng ta gửi một HTTP request với kích thước của Header lớn hơn giá trị được đặt cho max-http-header-size. Server sẽ từ chối request và trả về lỗi “400 Bad request” và chúng ta sẽ thấy lỗi Request Header Is Too Large được log lại.
Ví dụ chúng ta có ứng dụng Spring Boot 2.0 với Controller sau:
@RestController @RequestMapping(value = "/request-header-test") public class MaxHttpHeaderSizeController { @GetMapping public boolean testMaxHTTPHeaderSize(@RequestHeader(value = "token") String token) { return true; } }
Cấu hình server như sau
## 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
Khi chúng ta gửi HTTP request với giá trị của token lớn hơn 8KB thì chúng ta sẽ nhận được lỗi như bên dưới.
Và log sẽ tương tự như thế này
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 ...
Để giải quyết lỗi này chúng ta tăng giá trị của thuộc tính max-http-header-size trong application.properties để phù hợp với yêu cầu. Gỉa sử trong ứng dụng trên, mình sẽ tăng từ 8Kb lên 40Kb.
## Server connections configuration server.tomcat.threads.max=200 server.connection-timeout=5s server.max-http-header-size=40KB server.tomcat.max-swallow-size=2MB server.tomcat.max-http-post-size=2MB
Sau đó chạy lại ứng dụng và request sẽ không còn lỗi như trên nữa.
Do đó, bất cứ khi nào kích thước HTTP Header vượt quá giá trị mặc định của web server chúng ta sẽ thấy nó trả về 400-Bad Request kèm theo lỗi “request header is too large”. Lúc này chúng ta phải ghi đè giá trị max-http-header-size trong application.properties để phù hợp với kích thước của các HTTP Header.
Tóm lược
Qua bài viết này chúng ta đã tìm hiểu nguyên nhân gây ra lỗi 00-Bad Request kèm theo lỗi “request header is too large” và cách khắc phục bằng cách chỉnh giá trị max-http-header-size trong application.properties.
Nguồn tham khảo