@PathParam接收URL参数时反斜杠被转为正斜杠的问题
问题原因及解决办法
这问题我之前做JAX-RS项目时也踩过坑,咱们一步步拆解来看:
为什么反斜杠会被转成正斜杠?
核心原因是URL规范和框架的默认处理逻辑:
- 根据HTTP的RFC规范,URL路径部分的合法分隔符只有正斜杠
/,反斜杠\属于非法字符。为了保证URL的合规性,大多数Web服务器(比如Tomcat、Jetty)和REST框架(比如Jersey、RESTEasy)会自动将路径中的\替换为/,避免解析出错。 - JAX-RS的实现(比如你可能在用的Jersey)默认会把
\视为/的等价字符,所以在通过@PathParam捕获参数时,已经完成了替换。
怎么解决这个问题?
根据你的场景,有几种可行的方案:
方案1:客户端请求时先做URL编码
这是最规范的做法,因为反斜杠本身就不应该直接出现在URL路径里。客户端需要把参数中的\编码为%5C,比如把请求URL改成:http://localhost:8080/project/helloe%5C
这样服务端通过@PathParam就能直接获取到原始的helloe\值,不需要额外处理。
方案2:服务端用@Encoded注解获取原始编码值
如果没办法修改客户端的请求格式,可以在服务端通过@Encoded注解拿到编码后的参数,再自行解码:
@GET @Path("/project/{param}") public Response getParameter(@Encoded @PathParam("param") String encodedParam) { try { String originalParam = URLDecoder.decode(encodedParam, StandardCharsets.UTF_8.name()); return Response.ok(originalParam).build(); } catch (UnsupportedEncodingException e) { return Response.status(Response.Status.BAD_REQUEST).build(); } }
这个方法能绕过框架的自动替换逻辑,拿到原始的请求参数内容。
方案3:修改服务器/框架的配置(谨慎使用)
有些Web服务器允许开启对反斜杠的支持,比如Tomcat可以在conf/server.xml的Connector标签里添加allowBackSlash="true":
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" allowBackSlash="true"/>
不过要注意,这个配置会带来安全风险(比如路径遍历攻击),除非你完全信任请求来源,否则不推荐使用。
内容的提问来源于stack exchange,提问作者Goutham
相关产品推荐
相关产品推荐

