Social Icons

.

пятница, 14 сентября 2012 г.

Русские буквы в параметрах запроса к Tomcat

Давно заметил, что просто так кириллица из веб формы на сервер не попадает - приходится всякий раз изобретать что-то, что бы конвертило кракозяблики вида %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"/> 
 Другой источник, рекомендует исправлять его несколько иначе:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>

Комментариев нет:

Отправить комментарий

 

Так говорил Учитель:

У хорошо написанной программы есть свой собственный рай, у плохо написанной — свой собственный ад.

Russian Developer

Взгляд его светел, усилия праведны, старания бесплодны, дело безнадежно ...