В чем смысл настройки URIEncoding для Tomcat?

В Apache Tomcat параметр URIEncoding сообщает Tomcat, как интерпретировать входящие URI:

URIEncoding

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

Apache Tomcat 7 - HTTP-коннектор

Однако, как объясняется, например, в Каков правильный способ кодирования URL-символов Unicode?, символы, отличные от ASCII в URI, всегда кодируются в UTF-8, согласно действующим стандартам (RFC 3986 и 3987).

Итак:

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

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

+3
источник поделиться
2 ответа

Описание параметра URIEncoding в Tomcat 8 - Apache Tomcat 8 - Соединитель HTTP:

Это определяет кодировку символов, используемую для декодирования байтов 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:

Похоже, это связано с тем, что разработчики Tomcat полагали, что это именно то, чего требует спецификация сервлета (как указывает название параметра 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_SPEC-146 теперь помечен как решенный.

+3
источник

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос