使用Angular 4的弹簧启动时出现HTTP 413错误

时间:2018-03-15 08:17:37

标签: java http spring-boot centos jetty

我的系统由一个角度应用程序组成,该应用程序在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服务器时,第一个请求会通过,但后续请求会失败。这表明服务器上有一些缓冲区或缓存未及时清除。我的理解是否正确?

3 个答案:

答案 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