Подтвердить что ты не робот

Request.getQueryString(), похоже, нуждается в некоторой кодировке

У меня есть проблема с 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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Из HttpServletRequest # getQueryString() javadoc:

Возвращает: Строка, содержащая строку запроса или null, если 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). Также см. Ответ Mirage.

Ответ 3

Это занял целый день, но:

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

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

Ответ 4

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

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

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

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

Ответ 5

На кодирование параметров запроса 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.если у вас есть конечный сервер, проверьте значение символьной кодировки сервера. В случае сервера backcat tomcat добавьте атрибут "URIEncoding =" UTF-8 "в ваш Коннектор. Например,

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

...

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

Ответ 6

pRes.setContentType("text/html; charset=UTF-8");
PrintWriter out = new PrintWriter(new (pRes.getOutputStream(), "UTF8"), true);

Используя приведенный выше код, я получил ожидаемый результат:)