我的系统由一个角度应用程序组成,该应用程序与 Spring Boot 应用程序中的 REST 端点(POST)进行通信。 Spring boot配置为使用jetty作为嵌入式服务器。角度应用程序具有调用 REST 端点并发送 json 对象作为负载的 TypeScript 代码。根据用户在浏览器中的选择,json 对象的大小将从 1 MB 到 10 MB 不等。 我的 Spring Boot 应用程序在运行 Linux (CentOS) 的 Azure VM 中运行。 对于某些请求,我收到 HTTP 错误 413:请求大小太大。 我做了一些搜索,发现了 2 种机制来调整 Spring Boot 应用程序来克服这个限制。
选项1 使用此属性更改 application.properties 中的请求大小限制 server.jetty.max-http-post-size=20971520 # HTTP post 或 put 内容的最大大小(以字节为单位)。
选项2 在主应用程序类中使用一些java代码覆盖jetty maxFormContentSize
@Bean
public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
JettyEmbeddedServletContainerFactory jettyContainer =
new JettyEmbeddedServletContainerFactory();
org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer serverContainer = (org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer)jettyContainer.getEmbeddedServletContainer();
serverContainer.getServer().setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", "20971520");
return jettyContainer;
}
这些选项都不起作用,当某些请求很大时我仍然收到错误。
有没有更好的方法来解决这个问题?
注意:我仅在运行 CentOS 的 Azure VM 环境中看到此错误。在我运行 Windows 10 的机器中,我没有看到此错误
更新:我注意到,当网络服务器重新启动时,第一个请求会通过,但后续请求会失败。这表明服务器上有一些缓冲区或缓存没有及时清除。我的理解正确吗?
spring.http.multipart.max-file-size=200MB
spring.http.multipart.max-request-size=200MB
当您使用嵌入式 TOMCAT 运行时,这些设置将起作用。
将这些添加到 application.properties 文件中,以防请求是多部分的,并根据您的需要调整它们:
multipart.maxFileSize=20Mb
multipart.maxRequestSize=20Mb
否则,看看这个:https://stackoverflow.com/a/3861510/945214和这个:https://stackoverflow.com/a/36899004/945214
在您的示例中,您在 bean 定义中实例化的
JettyEmbeddedServletContainer
从未使用过,您可以覆盖的 bean 是 JettyEmbeddedServletContainerFactory
。看看 EmbeddedServletContainerAutoConfiguration.EmbeddedJetty
魔法发生的地方。
要根据需要修改属性,您可以使用
JettyServerCustomizer
界面:
@Bean
public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
factory.addServerCustomizers(server -> server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", 20971520));
return factor;
}
或
EmbeddedServletContainerCustomizer
:
@Component
public class FormSizeCustomizer implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
JettyEmbeddedServletContainerFactory factory = (JettyEmbeddedServletContainerFactory) container;
factory.addServerCustomizers(server -> server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize",
20971520));
}
}
此限制仅适用于具有
application/x-www-form-urlencoded
内容类型的请求。 要对 application/json
请求(或其他内容类型)强制实施最大大小,您需要自定义代码。您可以通过检查 Content-Length 标头或包装 ServletInputStream
并在使用分块请求时强制执行最大大小来实现此目的。
来源(Joakim 是 Jetty 开发人员):Jetty 和最大内容大小