Tomcat,JAX-RS,Jersey,@ PathParam:如何传递点和斜线?

时间:2012-06-21 02:30:41

标签: rest jersey jax-rs slash

有这样的方法:

@GET @Path("/name/{name}")
@Produces(MediaType.TEXT_PLAIN)
public String getProperty(@PathParam("name") String name) {
        System.out.println(name);
}

如何传递“test./test”之类的值?

/name/test./test     gives HTTP 404
/name/test.%2Ftest   gives HTTP 400
/name/test.%252Ftest prints test%2Ftest

但如果我执行name = URLDecoder.decode(name);,则会打印/test并且test.的第一部分会消失。

有一两个这样的问题已经存在,但它们已经过时了,找不到好的解决方案,我想我会再问一次。

4 个答案:

答案 0 :(得分:21)

@Path注释中的模式在内部变为正则表达式,默认情况下模板部分仅匹配选定的字符。特别是,他们通常匹配/个字符;这几乎总是正确的事情(因为它允许你将模板放在路径的一部分),但在这种情况下,它不是你想要消耗整个后续路径。为了获得所有内容,我们必须覆盖该特定模板的正则表达式片段;这实际上非常简单,因为我们只是在模板片段中放入一个:,然后是我们想要使用的RE:

@GET @Produces(MediaType.TEXT_PLAIN)
@Path("/name/{name:.+}")
public String getProperty(@PathParam("name") String name) {
    return name;
}

这将匹配/name/之后的所有字符(最多但不包括任何?查询部分),但只有匹配时才会匹配。请注意,如果您有任何其他@Path("/name/...")的事情,事情会变得非常混乱!所以不要这样做。

答案 1 :(得分:5)

如果您使用tomcat,并希望在pathparam中传递/。除了'Donal Fellows'所说的@Path("/name/{name:.+}")内容之外,你应该将-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true添加到你的jvm参数中,另请参阅tomcat security-howto

答案 2 :(得分:1)

Glassfish v4接受斜线%2f的编码scape。然后我们可以传递编码的String test。%2Ftest并使用URLDecoder.decode(name,“UTF-8”)获得结果test./test。我认为这是一个更好的解决方案,特别是当你在一个请求中有很多参数时。当我们在请求中包含很少的参数时,使用路径@Path(“/ name / {name:。+}”)是很好的解决方案。

使用%252f会使客户端请求变得复杂,因此需要手动构造编码请求String。使用glassfish v4,可以很容易地使用客户端中的URLEncoder.encode和服务器中的URLDecoder.decode进行百分比编码,以获得字符串。编程最多的语言具有百分比编码和解码,因此它是完美的解决方案。

我尝试在glassfish v3中启用编码斜杠,但没有成功,这是我尝试使用过的sintaxe

bin \ asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.encoded-slash-enabled = true configs.config.server-config.network-config。启用protocols.protocol.http侦听器1.http.encoded斜杠=真

命令集执行成功。

此致 Cassio Seffrin

答案 3 :(得分:0)

尝试指定编码类型,以下内容适用于/name/test.%252Ftest

System.out.println(URLDecoder.decode(name, "UTF-8"));
return URLDecoder.decode(name, "UTF-8");