首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat设置URIEncoding的意义是什么?

Tomcat设置URIEncoding的意义是什么?
EN

Stack Overflow用户
提问于 2016-02-08 14:07:15
回答 2查看 2.5K关注 0票数 3

在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中编码。

所以:

  • 为什么会有一个被标准强制执行的设置?
  • 为什么默认情况与标准规定不同?(ISO-8859-1而不是UTF-8)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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现在被标记为解决方案。

票数 4
EN

Stack Overflow用户

发布于 2016-03-16 11:29:26

我认为,至少对于Tomcat 6和低于URIEncoding是重要的,但也是必要的,许多人有问题,如果没有明确地将其设置为'UTF-8‘。至于你的问题,我只能假设它是为了向后兼容性。开发人员不喜欢一旦编写完代码就删除它,即使再次需要它的可能性是零:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35271612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档