0

我在 glassfish 3.1.2 生产服务器上遇到问题。我部署了一个 Jersey REST 项目,当任何 URL的路径参数中存在“空格”时,它会抛出 URISyntaxException。例如,如果我点击这个 URL:http://MyDomain:8080/MyApp/MyVersion/MyService/MyPathParam/My%20Path%20param Jersey throwsjava.lang.IllegalArgumentException with root cause java.net.URISyntaxException: Illegal character in path at index 155: http://MyDomain:8080/MyApp/MyVersion/MyService/MyPathParam/My Path param

查询参数不会发生错误。此问题在测试环境中不可重现。生产 glassfish 是否有可能在 Jersey 获取路径参数并且 jersey 抛出上述异常之前解码它们?我浏览了这个链接,它指定 glassfish 可以在请求参数到达我们的应用程序之前对其进行解码,但我没有得到明确的想法。请帮助我摆脱这个问题。

4

2 回答 2

1

在 URL (URI) 上使用“空格”不是一个好策略 - 请参阅此处的更多讨论 URL 是否允许包含空格?. 它们被认为是“不安全的”(http://www.ietf.org/rfc/rfc1738.txt):

空格字符是不安全的,因为当 URL 被转录或排版或接受文字处理程序的处理时,重要的空格可能会消失,并且可能会引入无关紧要的空格。

不确定某些“容器”是否允许在 URI 上这样做(“查询参数”可能在编码时被允许),但即使有些允许,您也应该认真考虑不使用它们。不确定这是否适合您的场景,但您可以URLEncoder.encode()按照其他问题中的建议进行尝试,其中会引发类似的异常:我必须做些什么来解决“java.lang.IllegalArgumentException”?(虽然在同一个问题中存在关于使用“空格”的辩论......但这也许对你有用)。

于 2013-10-03T07:33:51.637 回答
0

Apache 负载均衡器是罪魁祸首!mod_jk 正在解码 URL,并将解码后的 URL 转发到 glassfish 服务器之一。因此 jersey jax rs 抛出了 URISyntaxException。通过将 mod_jk 配置的属性JkOptions从 +ForwardURICompat 更改为+ForwardURICompatUnparsed解决了问题

于 2013-10-09T10:51:40.737 回答