这是一个Spring Boot 配置类,用于自定义UndertowWeb 服务器的配置,主要目的是调整请求体(包括文件上传)的最大大小限制。
一、类结构说明
1.@Configuration
- 表明这是一个Spring 配置类,会在应用启动时被加载。
- 用于定义和注册 Spring Bean。
2.UndertowConfig类
- 自定义 Undertow 服务器配置的配置类。
- 通常用于替代默认的 Tomcat 配置(如果项目使用的是 Undertow 作为内嵌服务器)。
二、核心配置项
1.MAX_ENTITY_SIZE
- 定义了一个常量:
10L * 1024 * 1024,即10 MB。 - 这是Long 类型,因为 Undertow 的相关选项使用 Long 类型。
- 该常量被用于两个地方:
- 普通请求体的最大大小
- 文件上传请求体的最大大小
三、核心 Bean:undertowCustomizer
1.返回值类型
WebServerFactoryCustomizer<UndertowServletWebServerFactory>- 这是一个工厂定制器,允许在 Spring Boot 启动时对 Undertow 服务器进行自定义配置。
2.定制逻辑
- 使用 Lambda 表达式创建定制器。
- 通过
factory.addBuilderCustomizers添加一个UndertowBuilderCustomizer。
四、两个关键配置项
在builder中设置了两个 Undertow 选项:
1.UndertowOptions.MAX_ENTITY_SIZE
- 作用:设置所有普通 HTTP 请求体的最大大小。
- 默认值:通常是 2 MB。
- 本次设置:调整为 10 MB。
2.UndertowOptions.MULTIPART_MAX_ENTITY_SIZE
- 作用:专门用于设置文件上传请求体的最大大小。
- 默认值:通常是 2 MB。
- 本次设置:调整为 10 MB。
五、为什么需要这个配置?
1.默认限制较小
- Spring Boot 默认的请求体限制通常是2 MB。
- 如果上传文件或处理大请求体时超过该限制,会抛出异常。
2.区分普通请求与文件上传
MAX_ENTITY_SIZE控制普通 POST/PUT 请求体大小。MULTIPART_MAX_ENTITY_SIZE控制multipart/form-data请求(文件上传)的大小。
3.统一调整为 10 MB
- 这里将两者统一设置为 10 MB,避免因请求体过大导致的错误。
六、使用场景
- 当你使用Spring Boot + Undertow作为服务器时。
- 需要上传大于 2 MB 的文件时。
- 需要处理较大的 JSON 或 XML 请求体时。
七、注意事项
仅适用于 Undertow
- 如果使用 Tomcat 或 Jetty,需要另一种配置方式。
可能会影响性能
- 设置过大会增加内存占用,需根据实际需求调整。
应与前端配置一致
- 如果前端也有文件上传大小限制,应保持一致。
可能还需要配置 Spring MVC 的上传限制
- 如
spring.servlet.multipart.max-file-size和max-request-size,两者需配合使用。
- 如
八、示例扩展
如果还需要设置其他 Undertow 参数,可以在builder中继续添加:
builder.setServerOption(UndertowOptions.MAX_ENTITY_SIZE,MAX_ENTITY_SIZE).setServerOption(UndertowOptions.MULTIPART_MAX_ENTITY_SIZE,MAX_ENTITY_SIZE).setServerOption(UndertowOptions.MAX_PARAMETERS,1000)// 增加最大参数数量.setServerOption(UndertowOptions.MAX_HEADERS,200);// 增加最大请求头数量这是一个典型的Spring Boot 嵌入式服务器定制配置,用于突破默认请求大小限制,特别适用于需要处理大文件上传或大数据请求的应用场景。
@Configuration public class UndertowConfig{// 配置你需要的最大请求大小,10MB=10*1024*1024 字节(Long类型,匹配UndertowOptions的Long常量) private static final long MAX_ENTITY_SIZE=10L *1024*1024;@Bean public WebServerFactoryCustomizer<UndertowServletWebServerFactory>undertowCustomizer(){return(UndertowServletWebServerFactory factory)->{factory.addBuilderCustomizers((builder)->{// 核心1:设置所有普通请求体最大大小(对应你看到的MAX_ENTITY_SIZE,默认2MB) builder.setServerOption(UndertowOptions.MAX_ENTITY_SIZE, MAX_ENTITY_SIZE)// 核心2:设置文件上传请求体最大大小(对应你看到的MULTIPART_MAX_ENTITY_SIZE,默认2MB) .setServerOption(UndertowOptions.MULTIPART_MAX_ENTITY_SIZE, MAX_ENTITY_SIZE);});};}}