Сервлет получает данные как в ISO-8859-1, так и в UTF-8. Как URL-декодировать? - PullRequest
1 голос
/ 28 мая 2010

У меня есть веб-приложение (на самом деле это просто сервлет), которое получает данные из 3 разных источников:

  • Источник A - это HTML-документ, написанный на UTF-8, и отправляющий данные через <form method="get">.
  • Источник B написан на ISO-8859-1 и отправляет данные также через <form method="get">.
  • Источник C написан в ISO-8859-1 и отправляет данные через <a href="http://my-servlet-url?param=value&param2=value2&etc">.

Сервлет получает параметры запроса и URL-декодирует их, используя UTF-8. Как и следовало ожидать, A работает без проблем, в то время как B и C не работают (вы не можете декодировать URL в UTF-8, что-то, что закодировано в ISO-8859-1 ...).

Я могу внести небольшие изменения в B и C, но мне не разрешено менять их с ISO-8859-1 на UTF-8, что решило бы все проблемы.

В B я смог решить проблему, добавив accept-charset="UTF-8" к <form>. Таким образом, он отправляет данные в UTF-8, даже если страница является ISO.

Что я могу сделать, чтобы исправить C?

В качестве альтернативы, есть ли способ определить кодировку сервлета, чтобы я мог вызывать URL-декодирование с правильной кодировкой в ​​каждом случае?


Редактировать : Я только что нашел это , что, похоже, решает мою проблему. Мне все еще нужно сделать несколько тестов, чтобы определить, влияет ли это на производительность, но я думаю, что я буду придерживаться этого решения.

Ответы [ 2 ]

3 голосов
/ 28 мая 2010

По умолчанию браузер отправляет данные в той же кодировке, в которой была возвращена запрошенная страница. Это можно контролировать с помощью заголовка HTTP Content-Type, который также можно установить с помощью HTML <meta> тег.

Следует избегать атрибута accept-charset элемента HTML <form>, поскольку он поврежден в MSIE. Почти все кодировки, отличные от UTF-8, игнорируются и будут отправляться в кодировке по умолчанию для платформы (обычно это CP-1252 в случае Windows).

Чтобы исправить A и B (POST), вам необходимо установить HttpServletRequest#setCharacterEncoding() перед сбором параметров запроса. Имейте в виду, что это одноразовое задание. Вы не можете получить параметр, а затем изменить кодировку и затем «повторно получить» параметры.

Чтобы исправить C (GET), вам необходимо установить кодировку URI запроса в конфигурации сервера. Поскольку неясно, какой сервер вы используете, вот пример, ориентированный на Tomcat: в HTTP-коннекторе установите следующий атрибут:

<Connector (...) URIEncoding="ISO-8859-1" />

Однако на большинстве серверов это уже кодировка по умолчанию. Так что, возможно, вам не нужно ничего делать для C.

В качестве альтернативы вы можете получить необработанные и не закодированные URL-адреса данные из тела запроса (в случае POST) по HttpServletRequest#getInputStream() или из строки запроса (в случае GET) HttpServletRequest#getQueryString(), а затем угадать кодирование самостоятельно на основе символов, доступных в параметрах, а затем кодирование URL соответственно с использованием предполагаемой кодировки. В этом может сильно помочь скрытый элемент ввода со специфическим символом, который отличается как в UTF-8, так и в ISO-8859-1.

0 голосов
/ 14 февраля 2011

Я отвечаю себе, чтобы пометить вопрос как решенный:

Я нашел этот вопрос , который охватывает точно ту же проблему, с которой я столкнулся. javax.servlet.Filter был решением для меня.

...