Как сохранить кодировку UTF-8 в Tomcat с GET-запросом

Из моего JSP я отправляю запрос GET с параметром под названием jobDetails, который содержит некоторые китайские символы [закодированные с помощью URLEncoder.encode()]. Теперь в doGET() моего сервлета мне нужно записать данные в файл. Когда я делаю

request.getParameter("jobDetails"); // this one retrieves wrong characters

Есть решение для этой настройки URIEncoding="UTF-8" в

 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

тег Tomcat, но наш архитектор делает все возможное, чтобы не изменять существующие настройки tomcat. Я попытался установить фильтр для установки characterEncoding() для запроса внутри doFilter(), как упоминалось в блоге BalusC. Но этот работает только для запросов POST. Есть ли другое решение, кроме изменения настроек Tomcat? Я использую Tomcat 6 и JDK 1.6.

4 ответа

Решение

Я нашел способ как-то... Я импортировал org.springframework.web.bind.ServletRequestUtils класс из org.springframework.web-3.0.0.RELEASE.jar и использовал следующее для анализа параметра 'jobDetails' из объекта 'request':

String jobDetails = new String((ServletRequestUtils.getStringParameter(request, "jobDetails")).getBytes("ISO-8859-1"), "UTF-8");

Извините, вам придется сказать своему архитектору, что иногда изменение конфигурации является единственным вариантом, и это один из таких случаев. Чтобы поддерживать символы UTF-8 в параметрах URL-адреса в Tomcat, необходимо добавить этот параметр в соединитель.

Если спорить с архитектором не очень весело (и это не так), анализ URLEncodedUtils должен делать то, что вам нужно.

public static void main( String[] args ) {
    List<NameValuePair> foo = null;
    List<String> encodings = Arrays.asList( "ISO-8859-1", "UTF-8" );

    for ( String e : encodings ) {
        System.out.println( String.format( "Interpreting as %s", e ) );
        foo = new ArrayList<NameValuePair>();
        URLEncodedUtils.parse( foo, new Scanner( "jobdetails=%C2%A2" ), e );

        for ( NameValuePair i : foo ) {
            System.out.println( String.format( "%s had value %s", i.getName(), i.getValue() ) );
        }
    }
}

Вам все еще нужно получить необработанную строку запроса для передачи этому методу, но это не должно быть слишком сложным. Поскольку он закодирован по URL, вам не нужно беспокоиться о кодировке, поскольку все символы, не входящие в ASCII, будут экранированы.

Вам не нужны внешние библиотеки. Просто используйтеString.getBytes():

      String jobDetails = new String(request.getParameter("jobDetails").getBytes("ISO-8859-1"), "UTF-8"));
Другие вопросы по тегам