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

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

29
задан BalusC 7 January 2016 в 15:42
поделиться

2 ответа

Я уже сталкивался с этой проблемой раньше. Не уверен, какой контейнер сервлетов 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) в карту параметров самостоятельно.

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

27
ответ дан 28 November 2019 в 00:57
поделиться

Из 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). Также см. Ответ Миража.

29
ответ дан 28 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: