【问题标题】:Tomcat, JAX-RS, Jersey, @PathParam: how to pass dots and slashes?Tomcat、JAX-RS、Jersey、@PathParam:如何传递点和斜线?
【发布时间】:2012-06-23 06:04:12
【问题描述】:

有这样的方法:

@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. 的第一部分就会消失。

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

【问题讨论】:

    标签: rest jersey jax-rs slash


    【解决方案1】:

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

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

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

    【讨论】:

    • 有效!可以通过任意数量的斜线,都被捕获就好了。这将适用于所有 JAX-RS 实现还是球衣的工作方式?不管怎样,非常感谢,它解决了我的问题。
    • @Maxim 我认为它是标准的,我将它与 Apache CXF 一起使用。
    • 看起来不错,但是这个正则表达式似乎不匹配反斜杠..
    【解决方案2】:

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

    【讨论】:

    • 只要路径确实包含/,而不是编码的,我就不需要它。
    【解决方案3】:

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

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

    【讨论】:

    • 有效!添加了编码,它将“test.%252Ftest”变为“test./test”,而不仅仅是“/test”。谢谢!
    【解决方案4】:

    Glassfish v4 接受斜线 %2f 的编码 scape。然后我们可以通过编码后的字符串 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

    命令集执行成功。

    问候 卡西欧·塞弗林

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      相关资源
      最近更新 更多