当前位置: 首页 > 知识库问答 >
问题:

在Angular 4上使用Spring引导时发生HTTP 413错误

唐兴思
2023-03-14

我的系统由一个角度应用程序组成,该应用程序与Spring启动应用程序中的 REST endpoint (POST) 进行通信。Spring启动配置为使用码头作为嵌入式服务器。角度应用程序具有调用 REST 终结点并将 json 对象作为负载发送的 TypeScript 代码。json 对象的大小将从 1 MB 到 10 MB 不等,具体取决于用户在浏览器中的选择。我的Spring启动应用程序在运行 Linux (CentOS) 的 Azure VM 中运行。对于某些请求,我得到HTTP错误413:请求大小太大。我做了一些搜索,发现了2种机制来调整Spring启动应用程序以克服此限制。

选项 1 使用此属性服务器.jetty 更改应用程序 .属性中的请求大小限制.max http-http-post-size=20971520 # HTTP 发布或放置内容的最大大小(以字节为单位)。

选项 2 使用主应用程序类中的一些 java 代码覆盖码头最大形式内容大小

@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().html" target="_blank">setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", "20971520");
    return jettyContainer;
}

这些选项都不起作用,当某些请求很大时,我仍然会出错。

有没有更好的方法来解决这个问题?

注意:我只在运行 CentOS 的 Azure 虚拟机环境中看到此错误。在我运行Windows 10的机器中,我没有看到此错误

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

共有3个答案

祁彬
2023-03-14

在您的示例中,您在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是码头开发人员):码头和最大内容大小

袁建木
2023-03-14

在请求是多部分的情况下,将它们添加到application.properties文件中,并根据您的需要调整它们:

multipart.maxFileSize=20Mb

multipart.maxRequestSize=20Mb

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

百里丁雨
2023-03-14

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

 类似资料:
  • 我们有一个网络应用程序,它用str_replace()替换一些文本。查找字符串和替换字符串存储在模板文件中。 我们需要将str_replace()函数替换为preg_replace(),以便能够在find字符串中使用regex(在同一模板文件中设置它们)。 在原始脚本中,我们有这样的php代码部分。 在一个文件中: 类SiteConfig{ } 在另一个文件中: 我试图用preg_replace替

  • 请帮助我在Spring启动应用程序,它不工作。我太紧张了。 文件夹列表 null 导入org.springframework.boot.springapplication;导入org.springframework.boot.autocigure.springbootapplication MainController类: 包装控制器; 和错误消息: 并且在资源/模板中有一个index.htm文件

  • 当线程停止时,关闭Spring引导的正确方法是什么?我不应该使用Spring中的吗? 谢谢!

  • 好吧,我正在通过选择视图技术作为jsp开发一个Spring启动应用程序。但是当我尝试引导Spring启动应用程序时,我得到了白色级别的错误页面。 那么请复习下面的代码。帮我解决哪里出了问题?

  • 从数据库获取数据时出错: 那我该怎么解决呢?