我注意到我的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中的错误或行为?
或者我应该确保每个指向我网页的链接都有方括号进行网址编码?当然,可能在我自己的网站上,但不是外部链接。
答案 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
我们还会仔细检查所有链接是否都编码方括号(他们已经应该这样做了)。