URL中的方括号会导致Tomcat中出现异常

时间:2012-05-09 17:41:58

标签: java url tomcat playframework urlencode

我注意到我的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中的错误或行为?

或者我应该确保每个指向我网页的链接都有方括号进行网址编码?当然,可能在我自己的网站上,但不是外部链接。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

我们还会仔细检查所有链接是否都编码方括号(他们已经应该这样做了)。