Tomcat 设置 URIEncoding 有什么意义?
What is the point of Tomcat's setting URIEncoding?
在 Apache Tomcat 中,参数 URIEncoding
告诉 Tomcat 如何解释传入的 URI:
URIEncoding
This specifies the character encoding used to decode the URI bytes,
after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
Apache Tomcat 7 - The HTTP Connector
但是,如 What is the proper way to URL encode Unicode characters? 中的示例所述,URI 中的非 ASCII 字符始终按照当前标准(RFC 3986 和 3987)以 UTF-8 编码。
所以:
- 为什么甚至有标准强制要求的设置?
- 为什么默认值与标准要求不同? (ISO-8859-1 而不是 UTF-8)
这仅仅是因为 Tomcat 设置早于标准,并且为了向后兼容而保留?或者在某些情况下,不同于 UTF-8 的值有意义吗?
我看到至少对于 Tomcat 6 及以下 URIEncoding 不仅重要,而且是必要的,如果不明确将其设置为 'UTF-8',许多人会遇到问题。至于你的问题,我只能假设它是为了向后兼容。开发人员讨厌在编写代码后删除代码,即使再次需要它的可能性为零:)
Tomcat中参数URIEncoding
的说明 8 - Apache Tomcat 8 - The HTTP Connector:
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used.
因此描述从 Apache Tomcat 7. org.apache.catalina.STRICT_SERVLET_COMPLIANCE
默认值是 false 从 Apache Tomcat 8. 所以 UTF-8 是默认值Apache 的 URIEncoding Tomcat 8,这意味着 Tomcat 现在遵循标准(和常见用法)。
至于为什么 Tomcat 在 Tomcat 7 之前使用 ISO 8859-1 作为默认 URI 编码:
这似乎是因为 Tomcat 开发人员认为这是 Servlet 规范所要求的(如设置名称 STRICT_SERVLET_COMPLIANCE 所示)。
事实上,Servlet规范在任何版本中都没有明确提到URI编码。但是,它确实提到,如果 Content-Type
HTTP header 未通过 charset
(Servlet 规范 V2.1)指定编码,则 POST 数据必须解析为 ISO 8859-1。 5、“请求数据编码”)。显然,这被解释为默认情况下查询参数(以及整个 URI)也应解码为 ISO 8859-1。
根本问题可以说是 Servlet 规范没有指定用于解码 URI 的默认编码,更不用说更改此编码的方法了。这反过来可能是因为 URI 规范最初不允许 URI 中的 non-ASCII 个字符——这只是通过引入 IRI 来标准化,请参阅 2005 年 1 月的 RFC 3987。因此每个 servlet 容器都必须提出自己的默认值和配置参数,比如Apache中的URIEncoding
Tomcat.
这两个问题已被报告为违反 Servlet 规范的错误:
- SERVLET_SPEC-145 (original, broken link) - 指定默认 URL 编码
- SERVLET_SPEC-146 (original, broken link) - 添加指定 URL 编码的功能
说不定有一天Servlet规范会被修改...。至少 SERVLET_SPEC-146 现在标记为已解决。
在 Apache Tomcat 中,参数 URIEncoding
告诉 Tomcat 如何解释传入的 URI:
URIEncoding
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
Apache Tomcat 7 - The HTTP Connector
但是,如 What is the proper way to URL encode Unicode characters? 中的示例所述,URI 中的非 ASCII 字符始终按照当前标准(RFC 3986 和 3987)以 UTF-8 编码。
所以:
- 为什么甚至有标准强制要求的设置?
- 为什么默认值与标准要求不同? (ISO-8859-1 而不是 UTF-8)
这仅仅是因为 Tomcat 设置早于标准,并且为了向后兼容而保留?或者在某些情况下,不同于 UTF-8 的值有意义吗?
我看到至少对于 Tomcat 6 及以下 URIEncoding 不仅重要,而且是必要的,如果不明确将其设置为 'UTF-8',许多人会遇到问题。至于你的问题,我只能假设它是为了向后兼容。开发人员讨厌在编写代码后删除代码,即使再次需要它的可能性为零:)
Tomcat中参数URIEncoding
的说明 8 - Apache Tomcat 8 - The HTTP Connector:
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used.
因此描述从 Apache Tomcat 7. org.apache.catalina.STRICT_SERVLET_COMPLIANCE
默认值是 false 从 Apache Tomcat 8. 所以 UTF-8 是默认值Apache 的 URIEncoding Tomcat 8,这意味着 Tomcat 现在遵循标准(和常见用法)。
至于为什么 Tomcat 在 Tomcat 7 之前使用 ISO 8859-1 作为默认 URI 编码:
这似乎是因为 Tomcat 开发人员认为这是 Servlet 规范所要求的(如设置名称 STRICT_SERVLET_COMPLIANCE 所示)。
事实上,Servlet规范在任何版本中都没有明确提到URI编码。但是,它确实提到,如果 Content-Type
HTTP header 未通过 charset
(Servlet 规范 V2.1)指定编码,则 POST 数据必须解析为 ISO 8859-1。 5、“请求数据编码”)。显然,这被解释为默认情况下查询参数(以及整个 URI)也应解码为 ISO 8859-1。
根本问题可以说是 Servlet 规范没有指定用于解码 URI 的默认编码,更不用说更改此编码的方法了。这反过来可能是因为 URI 规范最初不允许 URI 中的 non-ASCII 个字符——这只是通过引入 IRI 来标准化,请参阅 2005 年 1 月的 RFC 3987。因此每个 servlet 容器都必须提出自己的默认值和配置参数,比如Apache中的URIEncoding
Tomcat.
这两个问题已被报告为违反 Servlet 规范的错误:
- SERVLET_SPEC-145 (original, broken link) - 指定默认 URL 编码
- SERVLET_SPEC-146 (original, broken link) - 添加指定 URL 编码的功能
说不定有一天Servlet规范会被修改...。至少 SERVLET_SPEC-146 现在标记为已解决。