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

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="()[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" />

修改后重启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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:52:07