首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Angular 4中使用spring boot时出现HTTP 413错误

在Angular 4中使用spring boot时出现HTTP 413错误
EN

Stack Overflow用户
提问于 2018-03-15 16:17:37
回答 3查看 6.4K关注 0票数 1

我的系统由一个angular应用程序组成,该应用程序与spring boot应用程序中的REST端点(POST)通信。Spring boot被配置为使用jetty作为嵌入式服务器。angular应用程序具有调用REST端点并将json对象作为有效负载发送的TypeScript代码。根据用户在浏览器中的选择,json对象的大小从1MB到10MB不等。我的spring boot应用程序运行在一个运行Linux (CentOS)的Azure VM中。对于某些请求,我得到HTTP错误413:请求大小太大。我做了一些搜索,找到了两种机制来优化spring boot应用程序,以克服这一限制。

选项1使用此属性server.jetty.max- HTTP - post - size =20971520 #HTTP post或put内容的最大大小(以字节为单位)更改application.properties中的请求大小限制。

选项2使用主应用程序类中的一些java代码覆盖jetty maxFormContentSize

代码语言:javascript
复制
@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环境中看到此错误。在我运行Windows10的机器上,我没有看到这个错误

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

EN

回答 3

Stack Overflow用户

发布于 2018-03-15 16:31:39

如果请求是分片的,请将它们添加到application.properties文件中,并根据需要进行调整:

multipart.maxFileSize=20Mb

multipart.maxRequestSize=20Mb

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

票数 0
EN

Stack Overflow用户

发布于 2018-03-15 16:53:18

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2018-07-10 03:50:43

在您的示例中,从未使用过在bean定义中实例化的JettyEmbeddedServletContainer,您可以覆盖的bean是JettyEmbeddedServletContainerFactory。看看魔术发生的地方EmbeddedServletContainerAutoConfiguration.EmbeddedJetty吧。

要根据需要修改该属性,可以使用JettyServerCustomizer接口:

代码语言:javascript
复制
@Bean
public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
    JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
    factory.addServerCustomizers(server -> server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", 20971520));
    return factor;
}

EmbeddedServletContainerCustomizer

代码语言:javascript
复制
@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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49294421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档