1

我有一个 Web 应用程序(嗯,实际上只是一个 servlet),它接收来自 3 个不同来源的数据:

  • 源 A 是用 UTF-8 编写的 HTML 文档,并通过<form method="get">.
  • 源 B 是用 ISO-8859-1 编写的,并且<form method="get">也通过 发送数据。
  • 源 C 用 ISO-8859-1 编写,并通过<a href="http://my-servlet-url?param=value&param2=value2&etc">.

servlet 接收请求参数并使用 UTF-8 对它们进行 URL 解码。正如您所料,A 可以正常工作,而 B 和 C 则失败(您无法在 UTF-8 中对以 ISO-8859-1 编码的内容进行 URL 解码......)。

我可以对 B 和 C 稍作修改,但我不能将它们从 ISO-8859-1 更改为 UTF-8,这样可以解决所有问题。

在 B 中,我已经能够通过accept-charset="UTF-8"添加<form>. 因此,即使页面是 ISO,它也会以 UTF-8 格式发送数据。

我能做些什么来修复C?

或者,有没有办法确定 servlet 上的字符集,所以我可以在每种情况下使用正确的编码调用 URL-decode?


编辑:我刚刚找到了这个,这似乎解决了我的问题。我仍然需要进行一些测试以确定它是否会影响性能,但我认为我会坚持使用该解决方案。

4

2 回答 2

3

默认情况下,浏览器将以与返回请求页面相同的编码发送数据。这可以通过 HTTPContent-Type标头控制,您也可以使用 HTML<meta>标记进行设置。

accept-charsetHTML元素的属性<form>应该避免,因为它在 MSIE 中被破坏了。几乎所有非 UTF-8 编码都将被忽略,并将以平台默认编码(在 Windows 的情况下通常为 CP-1252)发送。

要修复 A 和 B (POST),您基本上需要HttpServletRequest#setCharacterEncoding()在收集请求参数之前进行设置。请记住,这是一项一次性任务。您无法获取参数然后更改编码然后“重新获取”参数。

要修复 C (GET),您基本上需要在服务器配置中设置请求 URI 编码。由于不清楚您使用的是哪个服务器,这里有一个针对 Tomcat 的示例:在HTTP 连接器中设置以下属性:

<Connector (...) URIEncoding="ISO-8859-1" />

但是,这已经是大多数服务器中的默认编码。所以你可能不需要为 C 做任何事情。

HttpServletRequest#getInputStream()作为替代方案,您可以通过或从查询字符串(在 GET 的情况下)从请求正文(在 POST 的情况下)中获取原始和非 URL 编码的数据HttpServletRequest#getQueryString(),然后根据可用的字符自己猜测编码在参数中,然后使用猜测的编码进行相应的 URL编码。在 UTF-8 和 ISO-8859-1 中具有不同特定字符的隐藏输入元素可能对此有很大帮助。

于 2010-05-28T11:20:30.593 回答
0

我正在回答自己以将问题标记为已解决:

我发现了这个问题,它涵盖了我面临的完全相同的问题。这javax.servlet.Filter是我的解决方案。

于 2011-02-13T21:23:10.430 回答