You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高负载下QueryString存在但HttpServletRequest.getParameterMap()为空是什么原因?

排查方向

1. Tomcat 9.0.43 已知并发Bug

你使用的Tomcat 9.0.43版本存在官方确认的高并发下参数解析丢失Bug:NIO模式下Parameters对象被请求复用时,会错误保留上一次请求的「参数解析完成」标记,导致新请求不会触发参数解析逻辑,直接返回空参数Map。而URL中的Query String存储在独立的请求字段中,不受该Bug影响,完全匹配你遇到的现象。
该Bug在Tomcat 9.0.44及更高版本已修复,可以通过手动指定Tomcat版本验证:

<!-- Maven pom.xml 配置 -->
<properties>
    <tomcat.version>9.0.44</tomcat.version>
</properties>
// Gradle build.gradle 配置
ext['tomcat.version'] = '9.0.44'

2. 提前读取请求流导致表单参数解析中断

对于Content-Type为application/x-www-form-urlencoded的POST请求,Tomcat解析参数时会合并URL Query String和请求Body中的表单参数。如果调用getParameterMap()之前,有Filter、拦截器等组件提前读取了HttpServletRequest的getInputStream()或getReader()且未做流重置处理,会导致参数解析时读取Body失败,部分Tomcat版本会中断整个参数解析流程,连带Query String中的参数也不会写入ParameterMap。
可以在日志中新增Content-Type打印,确认异常请求是否为表单类型,再排查是否存在全局组件提前读取请求流。

3. 自定义ServletRequestWrapper线程安全问题

如果项目中使用了自定义ServletRequestWrapper实现请求体可重复读取,多数非官方实现的Wrapper会重写getParameterMap()方法,并发场景下未做线程安全处理时会偶发返回空Map。可以暂时移除自定义Wrapper验证问题是否复现。

内容的提问来源于stack exchange,提问作者Rubing Yang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:18:03