如何从JBoss获取最大POST大小?是否有跨Servlet容器通用实现方式?
获取Servlet容器的最大上传大小
一、JBoss/WildFly 特定实现方式
WildFly的全局最大POST大小对应配置文件(standalone.xml/domain.xml)中undertow子系统的max-post-size参数,可通过以下方式获取:
- JMX读取配置:
直接访问WildFly的MBean获取参数值,示例代码:
注意:需确保应用拥有足够的JMX权限,必要时调整WildFly的权限配置。import javax.management.MBeanServer; import javax.management.ObjectName; import java.lang.management.ManagementFactory; public long getWildFlyMaxPostSize() throws Exception { MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName serverName = new ObjectName("org.wildfly.extension.undertow:server=default-server"); return (Long) mBeanServer.getAttribute(serverName, "maxPostSize"); } - 应用级配置读取:如果你的Web应用通过
multipart-config(web.xml或注解)单独设置了上传限制,可通过ServletRequest获取该配置,但这是应用局部设置,非服务器全局值。
二、跨Servlet容器的通用实现方式
没有完全统一的标准API,但可以通过以下兼容方案适配Tomcat、Jetty、WildFly等容器:
同步配置参数
在应用配置文件(如application.properties、web.xml)中维护一个与服务器配置对齐的参数(例如max.upload.size=10485760),直接读取该值展示。此方式简单,但需人工确保服务器与应用配置同步。容器适配逻辑
根据当前运行的容器类型,调用对应容器的API获取配置,示例代码框架:public long getMaxUploadSize(ServletContext servletContext) { String containerInfo = System.getProperty("server.info"); try { if (containerInfo.contains("WildFly") || containerInfo.contains("JBoss")) { return getWildFlyMaxPostSize(); } else if (containerInfo.contains("Tomcat")) { org.apache.catalina.Context context = (org.apache.catalina.Context) servletContext.getAttribute("javax.servlet.context.tomcatInstance"); org.apache.catalina.Connector connector = context.getParent().getService().findConnectors()[0]; return connector.getMaxPostSize() <= 0 ? Long.MAX_VALUE : connector.getMaxPostSize(); } else if (containerInfo.contains("Jetty")) { org.eclipse.jetty.server.Server server = (org.eclipse.jetty.server.Server) servletContext.getAttribute("org.eclipse.jetty.server.Server"); org.eclipse.jetty.server.HttpConfiguration config = server.getConnectors()[0] .getConnectionFactory(org.eclipse.jetty.server.HttpConnectionFactory.class) .getHttpConfiguration(); return config.getMaxFormContentSize() <= 0 ? Long.MAX_VALUE : config.getMaxFormContentSize(); } } catch (Exception e) { e.printStackTrace(); } // 默认返回10MB作为 fallback return 10 * 1024 * 1024; }注意:需在编译时引入对应容器的API依赖(如Tomcat的
tomcat-catalina、Jetty的jetty-server),运行时由容器提供具体实现。兜底处理
若无法通过API获取,可在展示时增加“以服务器实际限制为准”的提示,或设置一个合理的默认值。
三、关键注意事项
- 需同时考虑服务器全局限制和应用局部
multipart-config限制,最终展示的有效上限是两者中的较小值。 - 部分容器中设置
max-post-size为0表示无上传大小限制,展示时需转换为“无限制”的友好提示。
内容的提问来源于stack exchange,提问作者queeg
相关产品推荐
相关产品推荐

