request.getQueryString (), кажется, нуждается в некоторой кодировке - PullRequest
29 голосов
/ 12 июня 2010

У меня проблемы с UTF-8.Мой клиент (реализованный в GWT) делает запрос к моему сервлету с некоторыми параметрами в URL, как показано ниже:

http://localhost:8080/servlet?param=value

Когда в сервлете я получаю URL, у меня возникают проблемы с UTF-8персонажи.Я использую этот код:

protected void service(HttpServletRequest request, HttpServletResponse response) 
                    throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");

        String reqUrl = request.getRequestURL().toString(); 
        String queryString = request.getQueryString();
        System.out.println("Request: "+reqUrl + "?" + queryString);
        ...

Итак, если я назову этот URL:

http://localhost:8080/servlet?param=così

результат будет примерно такой:

Request: http://localhost:8080/servlet?param=cos%C3%AC

Что я могу сделатьправильно настроить кодировку символов?

Ответы [ 5 ]

29 голосов
/ 12 июня 2010

Из HttpServletRequest # getQueryString () javadoc :

Возвращает : строка, содержащая строку запроса, или ноль, если URL-адрес не содержит строку запроса, Значение не декодируется контейнером.

Обратите внимание на последнее утверждение.Поэтому вам нужно URL-декодировать самостоятельно, используя java.net.URLDecoder .

String queryString = URLDecoder.decode(request.getQueryString(), "UTF-8");

Однако обычный способ сбора параметров - это просто использование HttpServletRequest # getParameter () .

String param = request.getParameter("param"); // così

Сервлет-контейнер уже URL-декодировал его для вас, если вы настроили его для использования правильной кодировки.request.setCharacterEncoding() влияет только на тело запроса (POST), а не на URI запроса (GET).Также см. Ответ Миража.

27 голосов
/ 12 июня 2010

Я сталкивался с этой же проблемой раньше. Не уверен, какой контейнер сервлетов Java вы используете, но по крайней мере в Tomcat 5.x (не уверен в 6.x) метод request.setCharacterEncoding() на самом деле не влияет на параметры GET. Ко времени запуска вашего сервлета параметры GET уже были декодированы Tomcat, поэтому setCharacterEncoding ничего не сделает.

Два способа обойти это:

  1. Измените настройку URIEncoding для вашего разъема на UTF-8. Смотри http://tomcat.apache.org/tomcat-5.5-doc/config/http.html.

  2. Как предлагает BalusC, самостоятельно декодируйте строку запроса и вручную анализируйте ее (в отличие от использования API ServletRequest) в карте параметров.

Надеюсь, это поможет!

20 голосов
/ 07 октября 2012

Это действительно заняло весь день, но:

final String param = new String(request.getParameter("param").getBytes(
                "iso-8859-1"), "UTF-8");

См. Также здесь .Обратите внимание, что это действительно если кодировка декодирования (URIEncoding в tomcat) сервера равна iso-8859-1 - в противном случае этот кодировку необходимо передать.от server.xml для Tomcat 7 см. мой цитируемый ответ

3 голосов
/ 21 ноября 2014

Для запроса POST я решил проблему следующим образом.

  1. Set URIEncoding = "UTF-8" attr в server.xml для Connector;(Я использую Tomcat 8)
  2. Установите request.setCharacterEncoding ("UTF-8") перед извлечением параметров.

Наконец, я получил правильные символы utf-8: например, Stringname = request.getParameter ("name");

имя содержит правильную строку utf-8.

1 голос
/ 28 февраля 2014

На кодирование параметров http-запроса влияют многие факторы.Вы можете обратиться к последовательному руководству для этой проблемы.

1.проверьте кодировку подтверждения вашей формы.

<form id="edit-box" name="edit-box-name" method="post" accept-charset="UTF-8">

2.проверьте значение кодировки символов по умолчанию на http-сервере.В случае http-сервера apache добавьте строку "AddDefaultCharset UTF-8" в файл httpd.conf.

3.Если у вас есть сервер, проверьте значение кодировки символов внутреннего сервера.В случае бэкэнд-сервера tomcat добавьте атрибут «URIEncoding =« UTF-8 »в ваш Connector. Например,

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"  redirectPort="8443" URIEncoding="UTF-8"/>

...

руководство для параметра запроса httpпроблемы кодирования

...