2016-02-08 59 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',很多人都會遇到問題。至於你的問題,我只能假定它是爲了向後兼容。開發者憎恨刪除代碼,一旦他們寫它,即使有史以來需要再次的可能性是零:)