使用 spring 引导和 tomcat 版本 9.0.31 的分段文件上传失败

Multipart file upload using spring boot with tomcat version 9.0.31 is failing

spring 引导应用程序中的多部分文件上传不适用于 tomcat 版本 9.0.31。但此功能在旧版本 9.0.30 上工作正常。但此版本存在漏洞并被迫升级版本。 请参阅下面给出的错误

 "timestamp": "2020-03-09T08:01:56.169+0000",
"status": 500,
"error": "Internal Server Error",
"message": "Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.impl.IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly",

错误日志如下

nested exception is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.impl.IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly] with root causeorg.apache.tomcat.util.http.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly

请帮忙解决这个问题。

这是 Tomcat 9.0.31 中的错误。 Apache 的 Bugzilla 中已经有一个条目:https://bz.apache.org/bugzilla/show_bug.cgi?id=64195.

根据错误报告,要防止此问题,您可以 - 使用 Http11Nio2Protocol 而不是 Http11NioProtocol - 使用 Tomcat 9.0.30,这不会发生(但在 Tomcat 的 AJP 协议中有严重的 Ghostcat 漏洞)

该问题将在 9.0.32 中修复(尚未发布)。

注意:当使用 http 而不是 https 时也不会出现该问题。

我认为该错误已在最新的 tomcat 版本 9.0.33 中修复。

在版本 9.0.31 中无法使用的多部分文件上传功能也已通过升级得到修复。另外,我尝试过使用owasp dependency checker检查是否有漏洞,发现这个版本没有漏洞。

只需使用以下 version:

升级您的依赖项
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>9.0.33</version>
</dependency>

另一个可能的解决方案是检查 tomcat 服务器是 运行 的用户。

在我的例子中,它不是 运行 root 用户。如果是这种情况,只需使用 root 用户重新启动 tomcat 服务器,问题就会解决。