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

Max*_*nya 15 rest jax-rs jersey slash

有这样的方法:

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

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

/name/test./test     gives HTTP 404
/name/test.%2Ftest   gives HTTP 400
/name/test.%252Ftest prints test%2Ftest
Run Code Online (Sandbox Code Playgroud)

但是,如果我做name = URLDecoder.decode(name);它打印/test,第一部分test.消失.

有一两个这样的问题,但它们已经老了,没有找到好的解决方案,我想我会再问一遍.

Don*_*ows 21

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

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

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


tur*_*ove 5

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