Как сохранить кодировку 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"));