在 Tomcat 上处理 URI 中的字符编码

IT小君   2021-12-09T03:46:45

在我试图帮助的网站上,用户可以在浏览器中输入一个 URL,比如跟随汉字,

  http://localhost:8080?a=测试

在服务器上,我们得到

  GET /a=%E6%B5%8B%E8%AF%95 HTTP/1.1

如您所见,它是 UTF-8 编码的,然后是 URL 编码的。我们可以通过在 Tomcat 中将编码设置为 UTF-8 来正确处理这个问题。

但是,有时我们会在某些浏览器上获得 Latin1 编码,

  http://localhost:8080?a=ß

变成

  GET /a=%DF HTTP/1.1

无论如何在Tomcat中正确处理这个问题?看起来服务器必须做一些智能猜测。我们不希望 100% 正确处理 Latin1,但假设一切都是 UTF-8,任何事情都比我们现在所做的要好。

服务器是Tomcat 5.5。支持的浏览器是 IE 6+、Firefox 2+ 和 iPhone 上的 Safari。

点击广告,支持我们为你提供更好的服务
评论(1)
IT小君

不幸的是,UTF-8 编码是URI 规范中的一个“应该” ,它似乎假设源服务器将以它们对目标服务器有意义的方式生成所有 URL。

我会考虑几种技术;所有都涉及自己解析查询字符串(尽管您可能比我更清楚设置请求编码是影响查询字符串到参数映射还是仅影响正文)。

首先,检查单个“高字节”的查询字符串:有效的 UTF-8 序列必须有两个或更多字节(维基百科条目有一个很好的有效和无效字节表)。

不太可靠的是查看请求中的“Accept-Charset”标头。我不认为这个标头是必需的(还没有查看 HTTP 规范进行验证),而且我知道 Firefox 至少会发送一个完整的可接受值列表。选择列表中的第一个值可能有效,也可能无效。

最后,您是否对日志进行了任何分析,以查看特定用户代理是否会始终使用此编码?

2021-12-09T03:46:45   回复