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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:08:18