URIEncoding
Tomcat 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_COMPLIANCE
8 的默认值是 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 现在标记为已解决。