当前位置: 首页 > 知识库问答 >
问题:

Tomcat的设置有什么意义?

宗涵蓄
2023-03-14

在Apache Tomcat中,参数URIEncoding告诉Tomcat如何解释传入的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不同的值有意义吗?

共有2个答案

满博
2023-03-14

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

易弘亮
2023-03-14

Tomcat 8-Apache Tomcat 8-HTTP连接器中参数URIEncode的描述:

这指定在%xx解码URL后用于解码URI字节的字符编码。如果未指定,将使用UTF-8,除非组织。阿帕奇。卡特琳娜。STRICT\u SERVLET\u COMPLIANCE system属性设置为true,在这种情况下将使用ISO-8859-1。

因此,该描述与Apache Tomcat 7的描述不同。组织的默认值。阿帕奇。卡特琳娜。Apache Tomcat 8中的STRICT\u SERVLET\u COMPLIANCE为false。因此UTF-8是Apache Tomcat 8的URIEncoding的默认值,这意味着Tomcat现在遵循标准(和常见用法)。

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

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

事实上,Servlet规范在任何版本中都没有明确提到URI编码。但是,它确实提到,如果Content-TypeHTTP标头没有通过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中的URIEncode

据报道,这两个问题是针对Servlet规范的bug:

  • SERVLET_SPEC-145(原始、断开的链接)-指定默认URL编码

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

 类似资料:
  • 问题内容: 我是Android的新手,必须在两个PCB之间建立蓝牙连接。我在API指南中看到了一行代码,但我仍然不清楚它的含义。我想知道是否有人可以帮助我。 这是代码: 我不明白的是! 他们为什么在两者之间放一些东西。我也看过比。这些元素做什么? 问题答案: 这样就形成了通用集。当您声明时: 表示对象应仅包含类型的对象。通常建议使用泛型集合,因为您可以获得类型安全性的直接好处。 Java Coll

  • 问题内容: 我不了解git中与CrLf设置相关的复杂性, 我正在一个团队中开发一个跨平台项目,希望Windows和Linux开发人员能够一起工作,而无需将git标记的文件仅由于行尾样式而修改。 各种设置是什么意思?选择任何选项会有什么后果?而对我来说,最好的解决方案是什么? 是的,我知道这个问题,那里的答案没有见地,因此无济于事。 问题答案: 的三个值: -当内容进入存储库(已提交)时,其行尾将转

  • 当将Springboot maven项目(版本2.3.4.release)部署到外部Tomcat容器时,官方指南说您需要按照提供的方式标记“spring-boot-starter-tomcat”依赖项,但实际上即使不这样做,包含“spring-boot-starter-tomcat”、“tomcat-embed-core”和“tomcat-embed-websocket”等lib的最终war包在T

  • 问题内容: 这可能是一个愚蠢的问题,但这不是在我的脑海中点击。 在Django中,惯例是将特定于应用程序的所有静态文件(即css,js)放入名为static的文件夹中。所以结构看起来像这样: 在我有: 因此,当我运行命令时: 它会在根目录下创建一个文件夹(与相同的目录myapp/) 这有什么意义呢?它不只是创建我所有静态文件的副本吗? 问题答案: 将来自多个应用程序的静态文件收集到一个路径中 那么

  • 问题内容: 在“ Jenkins URL”部分的Jenkins配置页面上,我将此选项设置为“ http://name_of_my_machine.jenkins:8080 / “通常,我通过以下方式打开jenkins:” http:// localhost:8080 / “但是这个新选项确实对我不起作用- 詹金斯(Jenkins)无法打开。那是什么意思呢? 问题答案: Jenkins无法自行确定其

  • 问题内容: 如果我已经在大多数主流浏览器中测试过我的页面,为什么我需要维护一个经过验证的代码?如果WebKit浏览器和Firefox支持框阴影和拐角半径,我想使用它们。我不在乎它们是否不会出现在Internet Explorer中。但是我通过不包含图像来降低HTTP请求的数量。 有效代码是否有优势?在搜索引擎优化还是其他方式? 问题答案: Google更喜欢它,因此对SEO很有好处。 它使您的网页