У меня есть некоторая проблема с 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
Что я могу сделать для установки правильно кодировки символов?
Я уже сталкивался с этой проблемой раньше. Не уверен, какой контейнер сервлетов 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) в карту параметров самостоятельно.
Надеюсь, это поможет!
Из 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ì
Контейнер сервлетов уже декодировал его для вас, если вы настроили его для использования правильной кодировки. request.setCharacterEncoding ()
влияет только на тело запроса (POST), но не на URI запроса (GET). Также см. Ответ Миража.