【问题标题】:Square brackets in URL causes exception in TomcatURL中的方括号导致Tomcat中的异常
【发布时间】:2012-05-18 06:35:05
【问题描述】:

我注意到我的 Play 中抛出了以下异常!在 Tomcat 上运行的应用程序:

javax.servlet.ServletException: java.net.URISyntaxException: Illegal character in path at index 35: /K-NAAN/lyrics/Is-Anybody-Out-There[]-lyrics/3807088
    play.server.ServletWrapper.service(ServletWrapper.java:157)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause

java.net.URISyntaxException: Illegal character in path at index 35: /K-NAAN/lyrics/Is-Anybody-Out-There[]-lyrics/3807088
    java.net.URI$Parser.fail(Unknown Source)
    java.net.URI$Parser.checkChars(Unknown Source)
    java.net.URI$Parser.parseHierarchical(Unknown Source)
    java.net.URI$Parser.parse(Unknown Source)
    java.net.URI.<init>(Unknown Source)
    play.server.ServletWrapper.parseRequest(ServletWrapper.java:241)
    play.server.ServletWrapper.service(ServletWrapper.java:132)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

根据this thread,方括号不是 URI 中的有效字符,编码它们是客户的责任吗?我在 MacOS 上的 Chrome 中得到了这个异常,但在 Firefox 上没有,这似乎意味着 Chrome 不会对它们进行编码。更糟糕的是,我很确定 googlebot 也会遇到该异常。

这里的正确做法是什么?

我可以调整 Tomcat 以某种方式接受或编码方括号吗?还是 Play 中的错误或行为?

或者我应该确保指向我页面的每个链接都有方括号 URL 编码?当然,可以在我自己的网站上使用,但对于外部链接则不然。

【问题讨论】:

  • 你说的最后一件事:你的页面的每个链接都应该有方括号 url 编码。您无法控制任意客户端向您发送无效网址。

标签: java url tomcat playframework urlencode


【解决方案1】:

任何链接如果想要使用不能直接在 URL 中使用或具有特殊含义的字符,都需要对 URL 中的字符进行编码。

为了让生活更复杂一点,我注意到 FireFox 经常显示未编码的字符,但在地址栏中发送编码的字符。在尝试调试此类问题时,值得使用类似 Firebug(或您的浏览器的等价物)来确保您知道实际发送的内容。

【讨论】:

    【解决方案2】:

    我们遇到的具体异常似乎是 Play 1.2.4 中的一个错误,应该在 1.2.5 中通过返回代码 400 而不是 500 来修复。

    https://groups.google.com/d/msg/play-framework/165UJ8LZ0e8/sD0na-NSxLUJ

    我们还将仔细检查所有链接是否编码方括号(它们已经应该)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2019-03-14
      • 2016-05-02
      相关资源
      最近更新 更多