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

t5zmwmid  于 2022-11-07  发布在  Angular
关注(0)|答案(3)|浏览(205)

我的系统由一个与REST端点通信的Angular 应用程序组成(POST)。Spring boot配置为使用jetty作为嵌入式服务器。角应用程序具有调用REST端点并将json对象作为有效负载发送的TypeScript代码。json对象的大小将根据用户在浏览器中的选择在1 MB到10 MB之间变化。我的Sping Boot 应用程序在运行Linux(CentOS)的Azure VM中运行。对于某些请求,我会收到HTTP错误413:请求大小太大。我做了一些搜索,发现了2种机制来调优Sping Boot 应用程序以克服这个限制。
选项1application.properties使用此属性server.jetty.max-http-post-size=20971520 #更改www.example.com中的请求大小限制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服务器重新启动时,第一个请求通过,但随后的请求失败。这表明服务器上有一些缓冲区或缓存没有被及时清除。我的理解正确吗?

ecfdbz9o

ecfdbz9o1#

最大文件大小=200MB
最大请求大小=200MB
这些设置将在运行嵌入式TOMCAT时起作用。

mjqavswn

mjqavswn2#

在www.example.com文件中添加这些内容application.properties(如果请求是多部分的),并根据您的需要调整它们:
多部分。最大文件大小=20Mb
多部分。最大请求大小=20Mb
不然,看看这个:https://stackoverflow.com/a/3861510/945214和这个:https://stackoverflow.com/a/36899004/945214

avwztpqn

avwztpqn3#

在您的示例中,您在bean定义中示例化的JettyEmbeddedServletContainer从未使用过,您可以覆盖的bean是JettyEmbeddedServletContainerFactory
要根据需要修改该属性,可以使用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标头或通过 Package ServletInputStream并在使用分块请求时强制最大大小来执行此操作。

资料来源(Joakim是Jetty开发人员):Jetty and max content size

相关问题