在Apache中,参数URIEncoding告诉Tomcat如何解释传入的URI:
URIEncoding --在%xx解码该URL之后,指定用于解码URI字节的字符编码。如果没有指定,将使用ISO-8859-1 .
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html
但是,正如在URL编码Unicode字符的正确方法是什么?中解释的那样,URI中的非ASCII字符总是按照当前标准(RFC 3986和3987)在UTF-8中编码。
所以:
这仅仅是因为Tomcat设置早于标准,并且为了向后兼容性而被保留吗?或者在某些情况下,一个与UTF-8不同的值是有意义的?
发布于 2016-03-16 12:02:43
Tomcat8-Apache 8- HTTP连接器中参数URIEncoding的描述
这指定在%xx解码URL之后用于解码URI字节的字符编码。如果没有指定,除非org.apache.catalina.STRICT_SERVLET_COMPLIANCE系统属性设置为true,否则将使用UTF-8,在这种情况下,将使用ISO-8859-1。
因此,描述与Apache 7的描述不同。org.apache.catalina.STRICT_SERVLET_COMPLIANCE的默认值是Apache 8中的false。所以UTF-8是Apache 8的URIEncoding默认值,这意味着Tomcat现在遵循标准(和常用用法)。
关于为什么Tomcat使用ISO 8859-1作为默认URI编码,直到Tomcat 7:
这似乎是因为Tomcat开发人员认为这是Servlet规范所要求的(如设置STRICT_SERVLET_COMPLIANCE的名称所示)。
事实上,Servlet规范没有在任何版本中明确提到URI编码。但是,它确实提到,如果Content-Type header没有通过charset指定编码(ServletSpecificationv2.5,“请求数据编码”),则必须将POST数据解析为ISO8859-1。显然,这意味着查询参数(以及整个URI)在默认情况下也应该解码为ISO 8859-1。
根本的问题是Servlet规范没有指定用于解码URI的默认编码,更不用说改变这种编码的方法了。这可能是因为URI规范最初不允许URI中的非ASCII字符--这只是通过引入IRIs来标准化的,参见2005年1月的RFC 3987。因此,每个servlet容器都必须提供自己的默认值和配置参数,例如Apache中的URIEncoding。
这两个问题被报告为违反Servlet规范的bug:
也许有一天Servlet规范会被修改..。。至少SERVLET_SPEC-146现在被标记为解决方案。
发布于 2016-03-16 11:29:26
我认为,至少对于Tomcat 6和低于URIEncoding是重要的,但也是必要的,许多人有问题,如果没有明确地将其设置为'UTF-8‘。至于你的问题,我只能假设它是为了向后兼容性。开发人员不喜欢一旦编写完代码就删除它,即使再次需要它的可能性是零:)
https://stackoverflow.com/questions/35271612
复制相似问题