Предположим, что у меня есть строка типа '=&?/;#+%', которая является частью моего URL-адреса, скажем так:
example.com/servletPath/someOtherPath/myString/something.html?a=b&c=d#asdf
где myString — указанная выше строка. Я закодировал критическую часть, поэтому URL выглядит как
example.com/servletPath/someOtherPath/%3D%26%3F%2F%3B%23%2B%25/something.html?a=b&c=d#asdf
Все идет нормально.
Когда я нахожусь в сервлете и читаю любой из request.getRequestURI()
, request.getRequestURL()
или request.getPathInfo()
, возвращаемое значение уже декодировано, поэтому я получаю строку вроде
someOtherPath/=&?/;#+%/something.html?a=b&c=d#asdf
и я не могу отличить настоящие специальные символы от закодированных.
Я решил конкретную проблему, полностью запретив вышеуказанные символы, что работает в этой ситуации, но мне все еще интересно, есть ли способ получить некодированный URL-адрес в классе сервлета.
ЕЩЕ ОДНА ПРАВКА: когда я столкнулся с этой проблемой прошлым вечером, я был слишком устал, чтобы заметить, что происходит на самом деле, что еще более странно! У меня есть отображение сервлета, скажем, /servletPath/* после что я могу поместить все, что захочу, и получить ответ моего сервлета в зависимости от остальной части пути, кроме, когда в пути есть %2F. В этом случае запрос никогда не попадает в сервлет, и я получаю 404! Если я поставлю '/' вместо %2F, все будет работать нормально. Я использую Tomcat 6.0.14 на Java 1.6.0-04 в Linux.