Получение неэкранированного пути сервлета из объекта HttpRequest - PullRequest
1 голос
/ 23 марта 2012

У меня есть собственный прокси-сервлет, который имеет дело с URL-адресами, которые содержат специальные символы (например, ; , . / в своем пути). Это потому, что это RESTful-приложение, которое имеет уродливые параметры пути. (Не комментируйте это, поскольку это не мое.)

Мой клиент (на самом деле wget, потому что браузеры обычно показывают неэкранированный URL) отправляет запрос на этот URL:

http://localhost:8080/MyApplication/proxy/foo/ugly%3Apart%2Fcomes%3Bhere/children
//note: %2F = '/', %3A = ':', %3B = ';'

В моем сервлете (сопоставленном с /proxy/*), когда я пытаюсь переслать запрос GET, я не могу восстановить его, потому что HttpRequest.getPathInfo() возвращает мне URL без выхода:

http://localhost:8080/MyApplication/proxy/foo/ugly:part/comes;here/children

И, следовательно, информация о том, какие / s и ; s были первоначально сбежали или не спаслись, теряется. И это имеет значение для меня, например; делает мой URL так называемым матричным URL, см. http://www.w3.org/DesignIssues/MatrixURIs.html, или все параметры пути REST сдвигаются косыми чертами.

На самом деле я обнаружил эту проблему на сервере Glassfish, поэтому я не уверен, что разные серверы приложений относятся к этому по-разному или нет. Я нашел только это в Servlet API:

getPathInfo () Возвращает любую дополнительную информацию о пути, связанную с URL, который отправил клиент, когда он сделал этот запрос.

Как я могу получить исходный, неэкранированный URL-адрес запроса, который был отправлен клиентом?

1 Ответ

1 голос
/ 23 марта 2012

Взгляните на HttpServletRequest getRequestURI() и getRequestURL() методы.

Если вам нужно удалить сопоставления контекста и сервлета, посмотрите getContextPath() и getServletPath().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...