2016-02-08 15 views
3

В Apache Tomcat, параметр URIEncoding говорит Tomcat, как интерпретировать входящие идентификаторы URI:В чем смысл настройки URIEncoding от Tomcat?

URIEncoding

Это указывает кодировку символов, используемый для декодирования байтов URI, после того, как % хх декодирования URL. Если не указано, будет использоваться ISO-8859-1.

Apache Tomcat 7 - The HTTP Connector

Однако, как описано, например, в What is the proper way to URL encode Unicode characters?, не-ASCII символов в URI, всегда кодируются в UTF-8, следуя действующим стандартам (RFC 3986 и 3987).

Итак:

  • Почему даже установка для чего-то, что предусмотрено стандартом?
  • Почему значение по умолчанию отличается от стандартного мандата? (ISO-8859-1 вместо UTF-8)

Это просто потому, что установка Tomcat предшествует стандарту и была сохранена для обратной совместимости? Или есть ли ситуация, когда значение, отличное от UTF-8, имеет смысл?

+0

Вопрос: [Как установить кодировку запроса в Tomcat?] (http: // stackoverflow .com/questions/6876697/how-to-set-request-encoding-in-tomcat) – sleske

ответ

2

Описание параметра URIEncoding в Tomcat 8 - Apache Tomcat 8 - The HTTP Connector:

Это указывает кодировку используется для декодирования байтов URI, после того, как% xx декодирует URL. Если не указано, UTF-8 будет использоваться, если для системного свойства org.apache.catalina.STRICT_SERVLET_COMPLIANCE установлено значение true, и в этом случае будет использоваться ISO-8859-1.

Таким образом, описание было изменено от такового Apache Tomcat 7. Значение по умолчанию org.apache.catalina.STRICT_SERVLET_COMPLIANCE ложно с Apache Tomcat 8. Таким образом, UTF-8, это значение по умолчанию URIEncoding для Apache Tomcat 8, что означает, что в настоящее время Tomcat следует стандартное (и общее использование).


Как почему Tomcat не используется ISO 8859-1 как кодировку URI по умолчанию до Tomcat 7:

Это, кажется, потому что devevelopers Tomcat считал, что это то, что спецификация Servlet требует (в качестве имени установки STRICT_SERVLET_COMPLIANCE).

На самом деле, спецификация Servlet явно не упоминает кодировку URI в любой версии. Тем не менее, он указывает, что данные POST должны анализироваться как ISO 8859-1, если заголовок HTTP Content-Type не указывает кодировку через charset (Спецификация сервлета V2.5, «Запрос кодирования данных»). По-видимому, это было интерпретировано как означающее, что параметры запроса (и, следовательно, весь URI) также должны быть декодированы как ISO 8859-1 по умолчанию.

Корневая проблема, возможно, заключается в том, что в спецификации сервлета не указывается кодировка по умолчанию, используемая для декодирования URI, не говоря уже о способе изменить эту кодировку. Это, в свою очередь, вероятно, связано с тем, что спецификация URI изначально не позволяла использовать символы, отличные от ASCII, в URI - это было стандартизировано только путем введения IRI, см. RFC 3987 с января 2005 года. Поэтому каждый контейнер сервлета должен был иметь свое собственное значение по умолчанию и конфигурацию параметр, такой как URIEncoding в Apache Tomcat.

Эти две проблемы были зарегистрированы как ошибки против Servlet Спецификация:

  • SERVLET_SPEC-145 - Specify кодирования URL по умолчанию
  • SERVLET_SPEC-146 - Добавить возможность указать кодировку URL

Может быть сервлетов спецификации будут изменены в один прекрасный день ...

+0

Интересный поиск doc, спасибо. Я действительно должен читать документы иногда :-). Похоже, Apache Devs полагает, что для спецификаций Servlet требуется декодировать URI как ISO 8859-1. На самом деле, я не нашел _anything_ о кодировке URI в спецификации сервлета (3.0), и есть открытая проблема (https://java.net/jira/browse/SERVLET_SPEC-146) об этом. Так что похоже, что он никогда не был правильно указан .... Не возражаете, если я отредактирую это в вашем ответе? – sleske

+0

Также см. Https://java.net/jira/browse/SERVLET_SPEC-145. Кажется, спецификация Servlet неоднозначна в отношении того, что по умолчанию используется кодировка URI. – sleske

+0

Ответ расширен с моими собственными исследованиями. Не стесняйтесь переделывать, если вы обнаружите какие-либо проблемы. – sleske

0

Я вижу, что по крайней мере для Tomcat 6 и ниже URIEncoding был не только важным, но и необходимым, поскольку многие люди имели проблемы, если явно не устанавливали его в «UTF-8». Что касается вашего вопроса, я могу только предположить, что он предназначен для обратной совместимости. Разработчики ненавидят, чтобы удалить код, как только они написали, даже если возможность когда-либо необходимости снова равна нулю :)

 Смежные вопросы

  • Нет связанных вопросов^_^