You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Tomcat升级至9.0.106后多附件(>10个)批量上传功能失效求助

Tomcat升级至9.0.106后多附件(>10个)批量上传功能失效求助

遇到这个问题确实挺闹心的,我之前也帮开发者排查过类似的Tomcat安全升级导致的上传限制问题,咱们一步步来拆解原因和解决办法:

问题根源:Tomcat安全补丁引入的默认限制

Tomcat在9.0.103版本中修复了CVE-2023-42795(文件上传DoS漏洞),为了默认提升安全性,新增了单请求文件上传的数量限制,默认值设为10个。这个限制并不是通过你关注的FileUploadBase.fileCountMax来控制的,而是Tomcat自身Multipart解析逻辑层新增的默认配置——所以你看FileUploadBase源码默认值还是-1(无限制),但实际运行时会被Tomcat的上层配置覆盖。

为什么修改catalina.properties里的FileUploadBase属性无效?

从9.0.103版本开始,Tomcat的Multipart请求处理流程做了调整:当解析multipart请求时,Tomcat会先根据自身的MultipartConfig配置(全局或Servlet级)生成FileUpload的参数,其中会强制覆盖FileUploadBase.fileCountMax的值,直接修改catalina.properties里的底层属性会被上层配置覆盖,所以完全不生效。

解决办法:通过Tomcat官方配置项调整限制

你可以根据自己的需求选择以下任意一种配置方式:

1. 全局Connector级别配置(修改conf/server.xml

在你的HTTP/HTTPS Connector标签中添加maxFileCount属性,设置你需要的上限(-1表示无限制):

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxFileCount="200" /> <!-- 这里设置你需要的数量,比如200 -->

这个配置会对所有web应用的multipart请求生效。

2. 全局Web应用级别配置(修改conf/web.xml或你的应用WEB-INF/web.xml

web-app标签下添加全局的multipart-config配置:

<web-app ...>
    <!-- 其他配置 -->
    <multipart-config>
        <file-count-max>200</file-count-max>
        <!-- 可选:还可以配置单个文件大小、总请求大小等 -->
        <!-- <file-size-max>10485760</file-size-max> -->
        <!-- <request-size-max>104857600</request-size-max> -->
    </multipart-config>
</web-app>

3. 单个Servlet级别配置(精准控制)

如果只有特定的上传Servlet需要放宽限制,可以给目标Servlet添加@MultipartConfig注解:

@MultipartConfig(fileCountMax = 200) // 这里设置允许的最大文件数
public class YourUploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 你的上传逻辑
    }
}

或者在应用的WEB-INF/web.xml中给对应Servlet添加配置:

<servlet>
    <servlet-name>YourUploadServlet</servlet-name>
    <servlet-class>com.yourpackage.YourUploadServlet</servlet-class>
    <multipart-config>
        <file-count-max>200</file-count-max>
    </multipart-config>
</servlet>

验证配置是否生效

配置完成后重启Tomcat,然后在你的doPost方法中打印request.getParts().size(),如果能正常获取超过10个的数量,就说明配置生效了。你也可以通过Tomcat的JMX控制台(比如VisualVM连接)查看Connector的maxFileCount属性,确认配置值是否正确加载。

内容来源于stack exchange

火山引擎 最新活动