有这样的方法:
@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.
的第一部分会消失。
有一两个这样的问题已经存在,但它们已经过时了,找不到好的解决方案,我想我会再问一次。
答案 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");