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/...")事情,事情会变得非常混乱!所以不要这样做.
如果你使用tomcat,并希望传递/pathparam.除了@Path("/name/{name:.+}")"Donal Fellows" 之类的内容之外,您应该添加-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true到您的jvm参数中,另请参阅tomcat security-howto.
| 归档时间: |
|
| 查看次数: |
10726 次 |
| 最近记录: |