Java игнорирование параметра строкового запроса # - PullRequest
0 голосов
/ 08 июля 2020

Я новичок в Java.

Добавляю новый параметр в конец URL-адреса, как показано ниже.

http://localhost: 8080 / BugReport / home? ProjectName = Thrivent: PS_Thrivent_SOW # 04_YSL1.1AggFL & Consulting

Я читаю это в своем сервлете, как показано ниже, с помощью request.getParameter

String projectNameStr = request.getParameter ("projectName");

Наблюдаю за странное поведение. Если я передам символ # вместе с параметром, тогда projectnameStr будет печатать только этот символ. т.е. Thrivent: PS_Thrivent_SOW

Я не могу прочитать всю строку, если в параметре присутствует символ #?

Как решить эту проблему? Пожалуйста, помогите мне здесь.

Ответы [ 3 ]

0 голосов
/ 08 июля 2020

'#' - это специальный символ, URL-адрес которого должен быть закодирован. См. https://www.urlencoder.io/learn/

Если вы замените его на% 23, поскольку он закодирован, ваш код будет работать, как ожидалось.

Примечание: если вы ожидаете пройти другие специальные символы как буквальные строковые значения, тогда вам нужно будет также закодировать эти символы, например '&'

0 голосов
/ 08 июля 2020

# рассматривается как специальный символ в URL-адресе, и вам необходимо закодировать его перед отправкой на сервер. Вы можете закодировать свои параметры с помощью JSTL следующим образом:

<c:url value="home" var="url">
  <c:param name="projectName" value="Thrivent:PS_Thrivent_SOW#04_YSL1.1AggFL&Consulting" />
</c:url>

<form action = "${url}">
    ...
    ...
    ...
</form>

Если вы хотите напрямую перейти по URL-адресу, используйте кодировщик URL-адресов для получения закодированного URL-адреса, например, у меня есть следующий закодированный URL-адрес из https://www.urlencoder.org/

http%3A%2F%2Flocalhost%3A8080%2FBugReport%2Fhome%3FprojectName%3DThrivent%3APS_Thrivent_SOW%2304_YSL1.1AggFL%26Consulting

Вместо использования стороннего кодировщика URL-адресов вы можете кодировать URL-адрес с помощью Java API следующим образом:

String projectName = "Thrivent:PS_Thrivent_SOW#04_YSL1.1AggFL&Consulting";
String url = "http://localhost:8080/BugReport/home?projectName=" + URLEncoder.encode(projectName, StandardCharsets.UTF_8);
0 голосов
/ 08 июля 2020

Потому что все, что находится после #, является фрагментом URL и не отправляется на сервер, поэтому сервер не может его прочитать.

URL-кодирование ваших значений для предотвращения использование зарезервированных символов:

http://localhost:8080/BugReport/home?projectName=Thrivent%3APS_Thrivent_SOW%2304_YSL1.1AggFL%26Consulting

На стороне сервера некоторые фреймворки могут декодировать значение за вас с помощью URL-адреса, или вам, возможно, придется сделать это вручную. Это должно подтвердить тестирование в вашем коде.

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