有这样的方法:
@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.
消失。
有这样的一个或两个问题了,不过他们都老了,有没有发现很好的解决办法,我想我会再问。
在该图案@Path
注释内部变成了正则表达式,在默认情况下仅匹配选定的字符模板的部分。 特别是,他们通常不匹配/
字符; 这几乎总是做正确的事(因为它可以让你把模板的一部分的方式,通过一个路径),但在这种情况下,它并不像你想消耗随后的整个路径。 要得到的一切,我们必须覆盖该特定模板的正则表达式片段; 这其实是很容易的,因为我们只是把模板中的片段:
其次,我们要使用的RE:
@GET @Produces(MediaType.TEXT_PLAIN)
@Path("/name/{name:.+}")
public String getProperty(@PathParam("name") String name) {
return name;
}
这将在以后的所有字符匹配/name/
(直到但不包括任何?
查询部分),但如果有什么东西在那里都将只匹配。 请注意,如果您有任何其他@Path("/name/...")
有关,事情可能会让人有些困惑的事情! 所以,不要做。
如果您使用的是Tomcat,并且希望通过/
在pathparam。 除了@Path("/name/{name:.+}")
的东西,“多纳尔研究员”说,你应该添加-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
到你的JVM参数,请参阅也Tomcat安全-HOWTO 。
GlassFish的V4接受斜杠%2F编码景观。 然后,我们可以通过编码字符串测试%2Ftest并得到结果test./test使用URLDecoder.decode(姓名,“UTF-8”)。 我认为这是一个更好的解决方案尤其是当你有很多PARAMS在一个请求。 使用路径@Path(“/名/ {名称:+}”)是当我们在一个请求几个参数很好的解决方案。
使用%252F becouse需要手动contruct编码请求字符串客户端请求复杂化。 GlassFish的V4可以很容易地使用百分号编码与URLEncoder.encode在客户端和URLDecoder.decode在服务器希望字符串。 最编程语言都有%的编码和解码,因此它是完美的解决方案。
我试图让GlassFish v3中,但没有成功编码的斜线,这里是我试图用sintaxe
斌\的asadmin设置configs.config.server-config.network-config.protocols.protocol.http侦听器1.http.encoded斜线启用=真configs.config.server-config.network-config.protocols.protocol启用.http侦听器1.http.encoded斜杠=真
命令集成功执行。
至于凯西奥Seffrin
尝试指定编码类型,对我下面的作品与/name/test.%252Ftest
:
System.out.println(URLDecoder.decode(name, "UTF-8"));
return URLDecoder.decode(name, "UTF-8");