Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Русские буквы в параметрах запроса к Tomcat
Постоянная ссылка 14-09-2007 anydoby java

Не один программист, наверное, когда сталкивается с локализацией (или i18n, как ее называют буржуи), недоумевает, какого х* сразу было не использовать всем одну и ту же кодировку. К сожалению эта мысль не пришла в голову создателям первых эвм и народ старался кто во что горазд, стараясь перещеголять друг-друга в изобретательности. В общем, речь пойдет о кодировках.

Давно заметил, что просто так кириллица из веб формы на сервер не попадает - приходится всякий раз изобретать что-то, что бы конвертило кракозяблики вида %D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9 в понятное слово - русский.

Для форм, отсылаемых методом POST, все решается довольно просто: браузеры обычно конвертируют символы при отсылке в кодировку, указанную в Сontent-type метатэге. Затем, чтобы правильно принять закодированные символы, можно использовать фильтр, который навешивается на нужный сервлет (или еще проще, на все сервлеты), и который устанавливает кодировку запроса и ответа, например, в utf-8.

Однако, это работает хорошо только для POST-форм, а вот GET и линки приходится дорабатывать напильником. Проблема в том, что параметры запроса (query string) - то, что идет после ? в урле, Tomcat'ом обрабатываются отдельно, и кодировка используется ISO-...., которая, естественно, не понимает русских букв...

Короче, разболтался я. Решение простое - в коннекторе Tomcat надо добавить атрибут - useBodyEncodingForURI="true". Или же URIEncoding, если вы уверены, в какой кодировке закодированы параметры. Я выбрал первый вариант + фильтр, и получил счастье. При установке useBodyEncodingForURI будет использована кодировка, которая используется при раскодировании тела запроса - перед запросом первого параметра нужно установить кодировку запроса - request.setCharacterEncoding("utf-8") - например.

Вот так выглядит подхаченый коннектор (файл server.xml):


    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" useBodyEncodingForURI="true"/>

Добавить комментарий

Предыдущая статья Запрещенный метод в IE Следующая статья Как итерировать по массиву примитивов в SQL запросе к iBATIS