Часть после # отсутствует в значении параметра запроса - PullRequest
4 голосов
/ 14 декабря 2011

Я сделал приложение hello world на Java на контейнере Tomcat.У меня есть строка запроса

code=askdfjlskdfslsjdflksfjl#_=_

с подчеркиванием по обе стороны от = в URL.Когда я попытался получить строку запроса в сервлете по request.getParameter("code"), я получил только askdfjlskdfslsjdflksfjl.Часть после # отсутствует.

Как это вызвано и как я могу ее решить?

Ответы [ 3 ]

5 голосов
/ 14 декабря 2011

Это потому, что часть URL после # не является частью запроса.

Раздел 3.4 утвержденного RFC гласит:

Компонент запроса обозначен первым вопросом знак ("?") и оканчивается символом цифры ("#") или к концу URI.

1 голос
/ 14 декабря 2011

Пожалуйста, прочитайте кодировку процентов в Википедии . # и = являются зарезервированными символами в URL. Только незарезервированные символы могут использоваться в URL в виде текста, все остальные символы должны кодироваться в URL . Значение # в кодировке URL равно %23, а = равно %3D. Так что это должно сделать:

code=askdfjlskdfslsjdflksfjl%23_%3D_

Если это на самом деле происходит от ссылки HTML <a> в некоторых JSP, например:

<a href="servletUrl?code=askdfjlskdfslsjdflksfjl#_=_">some link</a>

тогда вы должны были изменить его на JSTL <c:url>:

<c:url var="servletUrlWithParam" value="servletUrl">
    <c:param name="code" value="askdfjlskdfslsjdflksfjl#_=_" />
</c:url>
<a href="${servletUrlWithParam}">some link</a>

, чтобы он генерировался как

<a href="servletUrl?code=askdfjlskdfslsjdflksfjl%23_%3D_">some link</a>

Обратите внимание, что это не относится к Java / Servlets per se, это относится ко всем веб-приложениям.

1 голос
/ 14 декабря 2011

# интерпретируется только браузером, а не сервером.Если вы хотите передать символ # на сервер, вы должны URLE закодировать его.

Пример:

URLEncoder.encode("code=askdfjlskdfslsjdflksfjl#=", "UTF-8");
...