我在glassfish 3.1.2生产服务器上遇到了一个问题。我部署了一个Jersey REST项目,当任何URL的路径参数中有'space'时,它会抛出URISyntaxException。例如,如果我点击此网址:http://MyDomain:8080/MyApp/MyVersion/MyService/MyPathParam/My%20Path%20param
泽西投掷java.lang.IllegalArgumentException
根本原因java.net.URISyntaxException: Illegal character in path at index 155: http://MyDomain:8080/MyApp/MyVersion/MyService/MyPathParam/My Path param
查询参数出现不错误。 此问题在测试环境中无法重现。生产glassfish是否有可能在泽西获得它们之前解码路径参数并且球衣抛出上述异常?我经历了this链接,该链接指定glassfish具有在请求参数到达我们的应用程序之前对其进行解码的功能,但我没有明确的想法。请帮我摆脱这个问题。
答案 0 :(得分:1)
使用"空格"这不是一个好的政策。关于URL(URI) - 请参阅此处的更多讨论Is a URL allowed to contain a space?。他们被认为是'不安全的" (http://www.ietf.org/rfc/rfc1738.txt):
空格字符是不安全的,因为当URL被转录或排版或受到文字处理程序的处理时,重要的空格可能会消失并且可能会引入无关紧要的空格。
不确定是否有一些"容器"在URI上允许这个("查询参数"可以在编码时允许),但即使有些允许你也应该认真考虑不使用它们。不确定这是否适合您的情况,但您可以尝试URLEncoder.encode()
,如同提出类似例外的其他问题所示:What I have to do to solve "java.lang.IllegalArgumentException"?(尽管在同一个问题中存在关于使用&#34的争论;空格" ...但也许这对你有用。)
答案 1 :(得分:0)
Apache Load Balancer是罪魁祸首! mod_jk正在解码URL,并将解码后的URL转发到glassfish服务器之一。因此,泽西jax rs投掷URISyntaxException。通过将mod_jk配置的属性 JkOptions 从+ ForwardURICompat更改为 + ForwardURICompatUnparsed
来解决问题