3

在 Apache Tomcat 中,参数URIEncoding告诉 Tomcat 如何解释传入的 URI:

URI编码

这指定在 %xx 解码 URL 之后用于解码 URI 字节的字符编码。如果未指定,将使用 ISO-8859-1。

Apache Tomcat 7 - HTTP 连接器

但是,正如例如在什么是 URL 编码 Unicode 字符的正确方法中所解释的那样?, URI 中的非 ASCII 字符始终按照当前标准(RFC 3986 和 3987)以 UTF-8 编码。

所以:

  • 为什么甚至有一个标准规定的东西的设置?
  • 为什么默认值与标准要求的不同?(ISO-8859-1 而不是 UTF-8)

这仅仅是因为 Tomcat 设置早于标准,并且是为了向后兼容而保留的吗?或者在某些情况下,不同于 UTF-8 的值是有意义的?

4

2 回答 2

4

URIEncodingTomcat 8 - Apache Tomcat 8 - The HTTP Connector中的参数说明:

这指定在 %xx 解码 URL 之后用于解码 URI 字节的字符编码。如果未指定,则将使用 UTF-8,除非 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系统属性设置为 true,在这种情况下将使用 ISO-8859-1。

因此描述从 Apache Tomcat 7 改变了。 Apache Tomcat org.apache.catalina.STRICT_SERVLET_COMPLIANCE8 的默认值是 false。所以 UTF-8 是 Apache Tomcat 8 的 URIEncoding 的默认值,这意味着 Tomcat 现在遵循标准(和常见用法)。


至于为什么 Tomcat 使用 ISO 8859-1 作为 Tomcat 7 之前的默认 URI 编码:

这似乎是因为 Tomcat 开发人员认为这是 Servlet 规范所要求的(正如设置 STRICT_SERVLET_COMPLIANCE 的名称所表明的那样)。

事实上,Servlet 规范在任何版本中都没有明确提及 URI 编码。但是,它确实提到,如果HTTP 标头未通过(Servlet 规范 V2.5,“请求数据编码”)Content-Type指定编码,则必须将 POST 数据解析为 ISO 8859-1。charset显然,这被解释为意味着查询参数(以及整个 URI)也应该默认解码为 ISO 8859-1。

根本问题可以说是 Servlet 规范没有指定用于解码 URI 的默认编码,更不用说更改这种编码的方法了。这可能是因为 URI 规范最初不允许在 URI 中使用非 ASCII 字符——这只是通过引入 IRI 来标准化的,参见2005 年 1 月的RFC 3987。因此每个 servlet 容器都必须提供自己的默认值和配置参数,例如URIEncoding在 Apache Tomcat 中。

这两个问题已被报告为违反 Servlet 规范的错误:

也许有一天 Servlet 规范会被修改...... 至少 SERVLET_SPEC-146 现在标记为已解决。

于 2016-03-16T12:02:43.890 回答
0

我看到至少对于 Tomcat 6 及以下版本,URIEncoding 不仅重要,而且必要,如果没有明确将其设置为“UTF-8”,许多人都会遇到问题。至于你的问题,我只能假设它是为了向后兼容。开发人员讨厌在编写代码后删除代码,即使再次需要它的可能性为零:)

于 2016-03-16T11:29:26.053 回答