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

@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:40:37