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
Что я могу сделать, чтобы правильно настроить кодировку символов?
Ответы
Ответ 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);
Используя приведенный выше код, я получил ожидаемый результат:)