Давайте предположим, что у меня есть строка типа '= &? /; # +%', Которая будет частью моего 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.