Tomcat与Spring:含EVAL关键字的查询参数被截断问题
Spring + Tomcat 8.5.92 查询参数含括号时被截断的解决方案
针对你遇到的siteOid=S_EVAL(TEST)被截断为S_的问题,以下是可行的修复方案和分析:
1. 对请求中的括号进行URL编码
首先确保URL路径和查询参数中的括号都经过URL编码。浏览器会自动编码特殊字符,但cURL和Postman在传递原始值时可能不会。用%28代替(,%29代替):
curl --location 'http://localhost:8085/studies/S_STD01%28TEST%29/roles?siteOid=S_EVAL%28TEST%29'
这样能确保服务器将括号视为字符串的一部分,而非特殊语法。
2. 更新Tomcat的relaxedPathChars配置
你当前的relaxedPathChars仅允许[]|,但URL路径中包含()。Tomcat的路径解析器可能因路径中思维定未不能 gre�otto�<span YX SayCom给查询参数处理带来意外影响。将()添加到relaxedPathChars`中:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxParameterCount="1000" relaxedPathChars="()[]|" relaxedQueryChars="()[]|{}^\`"<>" />
修改后重启Tomcat生效。
3. 禁用Tomcat的参数表达式解析功能
Tomcat默认会将参数值当作EL表达式解析。EVAL(TEST)可能被识别为表达式(解析后为空值),最终只剩下S_。要禁用该功能,在Tomcat的启动脚本(如setenv.sh或catalina.sh)中添加以下系统属性:
CATALINA_OPTS="-Dorg.apache.tomcat.util.http.Parameters.ENABLE_PARSING=false"
添加后重启Tomcat。
4. 验证控制器参数绑定
检查你的控制器方法,确保正确使用@RequestParam,避免意外触发SpEL表达式解析。正确的绑定示例:
@PostMapping("/studies/{studyOid}/roles") public ResponseEntity<?> processRoles( @PathVariable String studyOid, @RequestParam("siteOid") String siteOid ) { // 直接使用siteOid,不要在此处使用SpEL语法 return ResponseEntity.ok(siteOid); }
除非明确需要,否则不要在@RequestParam中使用#{...}这类SpEL表达式,否则可能会导致参数值被意外解析。
根因分析
参数被截断为S_,说明服务器将EVAL(TEST)识别为特殊结构:
- Tomcat路径解析器未配置允许路径中的括号,导致解析错误影响了查询参数的处理。
- Tomcat的EL表达式解析功能将
EVAL(TEST)解析为空表达式,从而剥离了这部分参数值。 - 缺少URL编码导致服务器将括号误判为分隔符,而非字面字符。
内容的提问来源于stack exchange,提问作者Umair Mayo
相关产品推荐
相关产品推荐

