Java 17后端无法接收含|字符的@RequestParam请求,求解决方案
解决方案:Java 17后端无法接收带
|字符的请求参数 可行方案
1. 前端对参数值进行URL编码
在Angular发送请求时,将filter参数里的|编码为%7C,后端可自动解析回原字符。Angular的HttpClient支持自动编码参数,示例如下:
// 使用HttpParams自动编码参数 import { HttpParams } from '@angular/common/http'; const params = new HttpParams().set('filter', 'ruleNumber|4'); this.http.get('/revision/2609', { params });
编码后的请求URL会变为http://localhost:8080/revision/2609?filter=ruleNumber%7C4,后端能正常接收filter参数值为ruleNumber|4。
2. 后端调整Tomcat特殊字符限制
若无法修改前端代码,可通过Spring Boot配置放宽Tomcat对查询参数的字符限制。在application.properties中添加:
# 允许查询参数中包含|字符 server.tomcat.relaxed-query-chars=|
如果使用Spring Boot 3.x版本,配置项调整为:
server.tomcat.allowed-chars=|
配置生效后,Tomcat会直接解析包含|的请求参数,无需修改后端接口代码即可匹配端点。
3. 排查自定义URL解析配置
检查项目中是否存在自定义的UrlPathHelper或RequestMappingHandlerMapping配置,这类自定义配置可能覆盖了默认的URL解析规则,导致|字符被拦截。确保相关配置未禁用特殊字符的处理逻辑。
问题原因
Java 17通常搭配更高版本的Spring Boot(如2.7+或3.x),对应的Tomcat版本(9.x或10.x)默认收紧了URL特殊字符的限制。|属于RFC 3986定义的非标准分隔字符,新版Tomcat默认拒绝包含这类字符的请求;而Java 8时期使用的旧版Tomcat默认允许此类字符,因此升级后出现端点匹配失败的问题。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

