15

有这样的方法:

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

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

4

4 回答 4

21

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

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

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

于 2012-06-21T08:38:40.197 回答
6

如果你使用 tomcat,并且想传入/pathparam。除了@Path("/name/{name:.+}")“Donal Fellows”所说的东西之外,您还应该添加-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true到您的 jvm 参数中,另请参见tomcat security-howto

于 2013-07-15T08:49:47.030 回答
0

尝试指定编码类型,以下适用于我/name/test.%252Ftest

System.out.println(URLDecoder.decode(name, "UTF-8"));
return URLDecoder.decode(name, "UTF-8");
于 2012-06-21T08:26:29.483 回答
0

Glassfish v4 接受斜线 %2f 的编码景观。然后我们可以通过编码后的字符串 test.%2Ftest 并使用 URLDecoder.decode(name, "UTF-8") 得到结果 test./test。我认为这是一个更好的解决方案,尤其是当您在一个请求中有许多参数时。当请求中的参数很少时,使用路径 @Path("/name/{name:.+}") 是很好的解决方案。

使用 %252f 会使客户端请求复杂化,因为需要手动构造编码请求字符串。使用 glassfish v4,可以很容易地在客户端使用 URLEncoder.encode 和服务器中的 URLDecoder.decode 来使用百分比编码来希望的字符串。大多数编程语言都有百分比编码和解码,因此它是完美的解决方案。

我尝试在 glassfish v3 中启用编码斜线但没有成功,这是我尝试使用的 sintaxe

bin\asadmin 设置 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-listener-1.http.encoded-slash-enabled=true

命令集执行成功。

问候卡西奥·塞弗林

于 2014-03-04T14:57:20.377 回答