Квадратные скобки в URL-адресе вызывают исключение в Tomcat

Я заметил следующее исключение в моем 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)

Согласно этой теме, квадратные скобки не являются допустимыми символами в URI, и ответственность за это лежит на клиенте. их кодировать? Я получаю это исключение в Chrome в MacOS, но не в Firefox, что, похоже, подразумевает, что Chrome их не кодирует. Что еще хуже, я почти уверен, что googlebot также сталкивается с этим исключением.

Каков правильный образ действий здесь?

Могу ли я настроить Tomcat так, чтобы он каким-то образом принимал или кодировал квадратные скобки? Или это ошибка или поведение в Play?

Или я должен просто убедиться, что каждая ссылка на мои страницы имеет URL-кодировку в квадратных скобках? Можно, конечно, на моем собственном сайте, но не столько для внешних ссылок.


person alex_c    schedule 09.05.2012    source источник
comment
последнее, что вы сказали: каждая ссылка на ваши страницы должна иметь URL-адрес, закодированный в квадратных скобках. вы не можете контролировать произвольные клиенты, отправляющие вам недопустимые URL-адреса.   -  person jtahlborn    schedule 09.05.2012


Ответы (2)


Любая ссылка, которая хочет использовать символы, которые не могут использоваться непосредственно в URL-адресе или иметь особое значение, должна кодировать символы в URL-адресе.

Чтобы немного усложнить жизнь, я заметил, что FireFox часто отображает незакодированные символы, но отправляет закодированные символы в адресной строке. Стоит использовать что-то вроде Firebug (или его эквивалент для вашего браузера), чтобы убедиться, что вы знаете, что на самом деле отправляется, когда пытаетесь отладить такого рода проблему.

person Mark Thomas    schedule 09.05.2012

Конкретное исключение, с которым мы столкнулись, похоже, является ошибкой в ​​Play 1.2.4 и должно быть исправлено в 1.2.5, возвращая код 400 вместо 500.

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

Мы также проверим и дважды проверим, что все наши ссылки кодируются квадратными скобками (что они и так должны делать).

person alex_c    schedule 09.05.2012