Tomcat的,JAX-RS,泽西岛,@PathParam:如何通过点和斜线?(Tomcat, JA

2019-06-25 15:56发布

有这样的方法:

@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. 消失。

有这样的一个或两个问题了,不过他们都老了,有没有发现很好的解决办法,我想我会再问。

Answer 1:

在该图案@Path注释内部变成了正则表达式,在默认情况下仅匹配选定的字符模板的部分。 特别是,他们通常匹配/字符; 这几乎总是做正确的事(因为它可以让你把模板的一部分的方式,通过一个路径),但在这种情况下,它并不像你想消耗随后的整个路径。 要得到的一切,我们必须覆盖该特定模板的正则表达式片段; 这其实是很容易的,因为我们只是把模板中的片段:其次,我们要使用的RE:

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

这将在以后的所有字符匹配/name/ (直到但不包括任何?查询部分),但如果有什么东西在那里都将只匹配。 请注意,如果您有任何其他@Path("/name/...")有关,事情可能会让人有些困惑的事情! 所以,不要做。



Answer 2:

如果您使用的是Tomcat,并且希望通过/在pathparam。 除了@Path("/name/{name:.+}")的东西,“多纳尔研究员”说,你应该添加-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true到你的JVM参数,请参阅也Tomcat安全-HOWTO 。



Answer 3:

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



Answer 4:

尝试指定编码类型,对我下面的作品与/name/test.%252Ftest

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


文章来源: Tomcat, JAX-RS, Jersey, @PathParam: how to pass dots and slashes?