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-Type
或multipart/form-data
或application/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 在最新版本中不起作用。