Spring boot Embedded Tomcat "application/json" post request 限制为 10KB

Posted

技术标签:

【中文标题】Spring boot Embedded Tomcat "application/json" post request 限制为 10KB【英文标题】:Spring boot Embedded Tomcat "application/json" post request restriction to 10KB 【发布时间】:2016-12-01 02:55:19 【问题描述】:

我正在使用 Spring Boot 嵌入式 tomcat 发布休息服务。

Spring boot 版本使用最新的“1.3.6.RELEASE”

我要求将 application/json post 请求大小限制为 10KB。

厌倦了这个解决方案但不起作用, Increase HTTP Post maxPostSize in Spring Boot

请帮忙。

谢谢, 阿伦。

【问题讨论】:

不知道是否适合你,但是可以在Tomcat中配置:见tomcat.apache.org/tomcat-7.0-doc/config/http.html中的maxPostSize参数 我使用嵌入式 tomcat 尝试设置这个但不起作用,@Bean EmbeddedServletContainerCustomizer containerCustomizer() throws Exception return (ConfigurableEmbeddedServletContainer container) -> if (container instanceof TomcatEmbeddedServletContainerFactory) TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container ; tomcat.addConnectorCustomizers( (connector) -> connector.setMaxPostSize(10000); // 10 KB ); ; 【参考方案1】:

配置最大帖子大小仅适用于具有Content-Typemultipart/form-dataapplication/x-www-form-urlencoded 的请求。 Tomcat 中没有现成可用的机制来限制具有任何其他内容类型的请求的请求正文的大小,因此您必须编写一些代码。

您可以使用过滤器限制内容长度。例如,将以下类添加到您的 Spring Boot 应用程序将拒绝具有与 application/json 兼容的 Content-Type 和超过 10000 的 Content-Length 的请求:

@Component
static class ApplicationJsonRequestSizeLimitFilter extends OncePerRequestFilter 

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

    private boolean isApplicationJson(HttpServletRequest httpRequest) 
        return (MediaType.APPLICATION_JSON.isCompatibleWith(MediaType
                .parseMediaType(httpRequest.getHeader(HttpHeaders.CONTENT_TYPE))));
    


请注意,此过滤器不会拒绝没有超过 10000 字节的 Content-Length 标头的请求,例如使用分块编码的请求。

【讨论】:

谢谢安迪。它工作正常。如果没有 Content-Length 标头,那么 request.getContentLength() 或 request.getContentLengthLong() 的值将为零?我们可以用它来验证吗? 应该是 -1 而不是零 如果请求没有Content-Length标头,可以将ServletRequest包装成一个从this answer返回LimitedSizeInputStream的标头。

以上是关于Spring boot Embedded Tomcat "application/json" post request 限制为 10KB的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot Embedded MongoDb 数据预填充

Spring-Boot Embedded Tomcat - 生成 localhost.log 和 cataline.out 文件

Spring Boot 使用Jar打包发布, 并使用 Embedded Jetty/Tomcat 容器

Spring Boot Embedded Derby 在最新版本中不起作用。

我如何在@Embeddable 类中使用@Embedded 将json 发布到spring boot 控制器

如何使用 Embedded Tomcat 8 和 Spring boot 将子域转换为路径