Java сервлет sendRequest - проблема с кодировкой getParameter - PullRequest
3 голосов
/ 23 февраля 2011

Я создаю веб-приложение для моего урока с использованием Java-сервлетов.В какой-то момент я хочу перенаправить на страницу JSP, отправив также некоторую информацию, которая хочет использовать там (с помощью метода GET).В моем сервлете у меня есть следующий код:

String link = new String("index.jsp?name="+metadata.getName()+"&title="+metadata.getTitle());

response.sendRedirect(response.encodeRedirectURL(link));

В jsp я получаю эти параметры, используя

<%
request.getParameter("name");
request.getParameter("title");
%>

Все работает нормально, за исключением случаев, когда параметры не содержат только латинские символы(в моем случае они могут содержать греческие символы).Например, если имя = ΕΡΕΥΝΑΣ, я получаю имя = ¡¥.Как я могу исправить эту проблему кодирования (установив его в UTF-8)?Разве encodeRedirectURL () не выполняет эту работу?Должен ли я также использовать encodeURL () в какой-то момент?Я попробовал последний, но проблема все еще существовала.

Заранее спасибо:)

Ответы [ 4 ]

7 голосов
/ 24 февраля 2011

HttpServletResponse#encodeRedirectURL() не кодирует URL-адрес URL. Он добавляет атрибут jsessionid к URL-адресу только тогда, когда есть сеанс и у клиента отключены файлы cookie. Следует признать, что это запутанное название метода.

Вам необходимо самостоятельно кодировать параметры запроса с помощью URLEncoder#encode() при составлении URL.

String charset = "UTF-8";
String link = String.format("index.jsp?name=%s&title=%s", 
    URLEncoder.encode(metadata.getName(), charset), 
    URLEncoder.encode(metadata.getTitle(), charset));

response.sendRedirect(response.encodeRedirectURL(link));

И создайте фильтр , который сопоставлен с /* и выполняет в основном doFilter() метод:

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

И добавьте следующее к top вашего JSP:

<%@ page pageEncoding="UTF-8" %>

Наконец вы сможете отобразить их следующим образом:

<p>Name: ${param.name}</p>
<p>Title: ${param.title}</p>

Смотри также:

1 голос
/ 24 февраля 2011

Используйте java.net.URLEncoder для кодирования каждого параметра перед его добавлением в URL.Подумайте об этом так: если ваше имя содержит «&», как вы узнаете, что это не разделитель параметров?

0 голосов
/ 24 февраля 2011

Как насчет следующего?

  • Установить имя и заголовок в качестве атрибутов объекта запроса;
  • Получить диспетчер запросов для JSP из объекта запроса или черезконтекст сервлета;
  • Использование диспетчера запросов для пересылки запроса в JSP;
  • Доступ к этим атрибутам в запросе из JSP.

Это сохраняет перенаправлениебраузер от первого сервлета до производного от JSP сервлета и полностью исключает проблему кодирования параметров.

Также убедитесь, что директива страницы JSP устанавливает кодировку содержимого в UTF-8.

0 голосов
/ 24 февраля 2011

Вы должны закодировать каждый параметр запроса с помощью URLEncoder.encode(), прежде чем поместить его в строку запроса.

Метод encodeRedirectURL используется только для включения идентификатора сеанса в URL-адрес при необходимости (перезапись URL-адреса, если браузер не поддерживает файлы cookie)

...