繁体   English   中英

使用带有 Angular 4 的 Spring Boot 时出现 HTTP 413 错误

[英]HTTP 413 error when using spring boot with Angular 4

我的系统由一个 Angular 应用程序组成,该应用程序与 Spring Boot 应用程序中的 REST 端点 (POST) 进行通信。 Spring boot 配置为使用 jetty 作为嵌入式服务器。 Angular 应用程序具有调用 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 代码覆盖码头 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 的机器上,我没有看到这个错误

更新:我注意到当网络服务器重新启动时,第一个请求通过但后续请求失败。 这表明服务器上有一些缓冲区或缓存没有及时清除。 我的理解正确吗?

如果请求是多部分的,请在 application.properties 文件中添加这些,并根据您的需要调整它们:

multipart.maxFileSize=20Mb

multipart.maxRequestSize=20Mb

否则,看看这个: https ://stackoverflow.com/a/3861510/945214 和这个: https ://stackoverflow.com/a/36899004/945214

spring.http.multipart.max-file-size=200MB

spring.http.multipart.max-request-size=200MB

当您使用嵌入式 TOMCAT 运行时,这些设置将起作用。

在您的示例中,您在 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 和最大内容大小

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM