Spring Boot如何限制application/octet-stream请求体大小?
问题与解决方案:限制application/octet-stream请求体大小
问题背景
我正在开发一个通过HTTP POST请求接收文件的服务,文件以请求体形式发送,请求头为Content-Type: application/octet-stream,希望将请求体大小限制为10MB。使用的代码示例如下:
@RestController public class MyController { @PostMapping("save") public ResponseEntity<Map<String, Object>> save(@RequestBody byte[] data) { return ResponseEntity.ok(Map.of("size", data.length)); } }
测试用的curl命令:
curl -X POST -H "Content-Type: application/octet-stream" --data-binary "@my_big_binary_file.whatever" http://localhost:8080/save
尝试过以下配置但未生效:
server.tomcat.max-http-form-post-size=10MB server.tomcat.max-swallow-size=10MB
需求是让所有此类请求的大小都被限制为10MB,同时想了解这两个配置的作用是否符合预期。测试环境为Java 17,Spring Boot版本2.7.9和3.0.4。
正确的请求体大小限制方案
方案1:全局配置(适用于所有端点)
在application.properties或application.yml中添加以下配置:
server.max-http-request-size=10MB
这个配置是Spring Boot 2.0+提供的全局请求体大小限制,对所有Content-Type的HTTP请求生效,包括application/octet-stream,超过10MB的请求会直接被拦截,返回413(Payload Too Large)状态码。
方案2:单个端点精细控制
如果只需要限制特定端点的请求体大小,可以使用@RequestSize注解(Spring Boot 2.6及以上版本支持):
@RestController public class MyController { @PostMapping("save") public ResponseEntity<Map<String, Object>> save(@RequestBody @RequestSize(max = "10MB") byte[] data) { return ResponseEntity.ok(Map.of("size", data.length)); } }
当请求体超过10MB时,会抛出PayloadTooLargeException,Spring Boot会自动转换为413响应。
关于你尝试的两个Tomcat配置
server.tomcat.max-http-form-post-size:仅针对application/x-www-form-urlencoded类型的表单POST请求生效,也就是普通的键值对表单提交,和你的application/octet-stream请求完全不相关,所以设置后不会有效果。server.tomcat.max-swallow-size:这个配置不是用来限制请求体大小的,它的作用是当请求被Tomcat拒绝(比如超过大小限制)后,控制Tomcat是否继续读取剩余的请求体数据。默认值为2MB,设置为-1表示不限制读取剩余数据。它和你的请求体大小限制需求无关。
内容的提问来源于stack exchange,提问作者Marcelo Barros
相关产品推荐
相关产品推荐

