我的系统由一个角度应用程序组成,该应用程序在spring启动应用程序中与REST端点(POST)通信。 Spring启动配置为使用jetty作为嵌入式服务器。 angular应用程序具有调用REST端点的TypeScript代码,并将json对象作为有效内容发送。根据浏览器中的用户选择,json对象的大小将从1 MB到10 MB不等。 我的Spring启动应用程序在运行Linux(CentOS)的Azure VM中运行。 对于某些请求,我收到HTTP错误413:请求大小太大。 我做了一些搜索,找到了两种机制来调整弹簧启动应用程序来克服这个限制。
选项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的机器中,我没有看到此错误
更新:我注意到,当重新启动Web服务器时,第一个请求会通过,但后续请求会失败。这表明服务器上有一些缓冲区或缓存未及时清除。我的理解是否正确?
答案 0 :(得分:0)
在application.properties文件中添加这些文件以防请求是多部分并根据您的需要进行调整:
multipart.maxFileSize = 20MB的
multipart.maxRequestSize = 20MB的
否则,请看一下:https://stackoverflow.com/a/3861510/945214和此:https://stackoverflow.com/a/36899004/945214
答案 1 :(得分:0)
spring.http.multipart.max文件大小= 200MB
spring.http.multipart.max请求尺寸= 200MB
当您使用嵌入式TOMCAT运行时,这些设置将起作用。
答案 2 :(得分:0)
在您的示例中,从未使用在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 and max content size