java 如何在Sping Boot 中限制应用程序/八位字节流请求的主体?

k97glaaz  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(115)

我正在开发一个通过HTTP Post请求接收文件的服务。文件由带有Content-Type: application/octet-stream头的请求主体发送。我希望将请求主体限制为10MB。以下是我的目标MRE

@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以内?另外,我认为这是相关的:这两处房产的用途是什么?这不正是我所期待的吗?
在Sping Boot 2.7.9和3.0.4上使用Java 17进行测试
附言:我知道有一种方法可以使用下面的属性来限制multipart/form-data的请求。这工作得很好。但这不是我所需要的。

spring.servlet.multipart.max-file-size=10MB
j2datikz

j2datikz1#

好吧,Chin Huang插入的响应是有效的!你只需要稍微修改一下就可以限制八位流了。
大概是这样的:

@Component
public class ApplicationJsonRequestSizeLimitFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response, FilterChain filterChain)
                    throws ServletException, IOException {
        if (isApplicationOctet(request) && request.getContentLengthLong() > 10000) {
            throw new IOException("Request content exceeded limit of 10000 bytes");
        }
        filterChain.doFilter(request, response);
    }

    private boolean isApplicationOctet(HttpServletRequest httpRequest) {
        return (MediaType.APPLICATION_OCTET_STREAM.isCompatibleWith(MediaType
                .parseMediaType(httpRequest.getHeader(HttpHeaders.CONTENT_TYPE))));
    }
}

这个解决方案基于Chin Huang answer,只是调整了数据类型。

相关问题