【问题标题】:Spring boot Embedded Tomcat "application/json" post request restriction to 10KBSpring boot Embedded Tomcat "application/json" post request 限制为 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 } ); } }; }

标签: json rest tomcat post spring-boot


【解决方案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的标头。
猜你喜欢
  • 2017-11-06
  • 1970-01-01
  • 2013-04-15
  • 2017-06-28
  • 2018-05-12
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
相关资源
最近更新 更多