2016-02-08 62 views
3

在的Apache Tomcat,参数URIEncoding告诉Tomcat如何解释传入的URI:Tomcat的设置URIEncoding有什么意义?

的URIEncoding

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

Apache Tomcat 7 - The HTTP Connector

然而,如在What is the proper way to URL encode Unicode characters?例如解释的,在URI的非ASCII字符总是编码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

这指定的字符编码用于在%xx解码URL后解码URI字节。如果未指定,则将使用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的devevelopers认为这是什么Servlet规范要求(如名称的设置STRICT_SERVLET_COMPLIANCE指示)。

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

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

这两个问题一直被列为对Servlet规范的错误:

也许Servlet规范的能力将被修改一天...

+0

有趣的文档查找,谢谢。我有时候应该真的阅读文档:-)。因此,Apache开发人员认为Servlet规范要求解码URI为ISO 8859-1。事实上,我还没有在servlet spec(3.0)中找到关于URI编码的_anything_,并且存在一个关于这个问题的公开问题(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',很多人都会遇到问题。至于你的问题,我只能假定它是为了向后兼容。开发者憎恨删除代码,一旦他们写它,即使有史以来需要再次的可能性是零:)