【问题标题】:UTF-8 encoding a servlet form submission with Tomcat使用 Tomcat 对 servlet 表单提交进行 UTF-8 编码
【发布时间】:2012-01-13 13:39:10
【问题描述】:

我正在尝试将包含 unicode 字符的简单表单发布到 servlet 操作。在 Jetty 上,一切顺利。在 Tomcat 服务器上,utf-8 字符会被损坏。

我遇到的最简单的情况:

表格:

<form action="action" method="post">
  <input type="text" name="data" value="It’s fine">`
</form>`

行动:

class MyAction extends ActionSupport {   
  public void setData(String data) {
    // data is already mangled here in Tomcat
  } 
}
  • 我在 server.xml 中的 &lt;Connector&gt; 上有 URIEncoding="UTF-8"
  • 动作上的第一个过滤器调用 request.setCharacterEncoding("UTF-8");
  • 包含表单的页面的内容类型为“text/html; charset=UTF-8”
  • 在表单中添加“accept-charset”没有任何区别

我可以让它工作的唯一两种方法是使用 Jetty 或将其切换到 method="get"。这两种情况都会使角色顺利通过。

【问题讨论】:

标签: java tomcat servlets utf-8 jetty


【解决方案1】:

我在 server.xml 中的 &lt;Connector&gt; 上有 URIEncoding="UTF-8"

这仅与 GET 请求有关。


动作上的第一个过滤器调用request.setCharacterEncoding("UTF-8");

很好,这应该适用于 POST 请求。您只需要确保在调用setCharacterEncoding() 之前调用getParameter()getReader()getInputStream() 或其他任何会触发解析请求正文的情况。


包含表单的页面的内容类型是"text/html; charset=UTF-8"

如何你到底是怎么设置的?如果在 &lt;meta&gt; 中完成,那么您需要了解,当通过 HTTP 提供页面并且存在 HTTP Content-Type 响应标头时,浏览器会忽略。一般的网络服务器已经默认设置了它。 &lt;meta&gt; 内容类型将仅在页面保存到本地磁盘并从那里查看时使用。

要正确设置响应标头字符集,请将以下内容添加到 JSP 顶部:

<%@page pageEncoding="UTF-8" %>

顺便说一句,这也会告诉服务器以给定的字符集发送响应。


在表单中添加“accept-charset”没有区别

它只在 MSIE 中有所不同,但即便如此,它也错误地使用它。无论如何,整个属性毫无价值。算了。

另见:

【讨论】:

  • 包含表单的页面响应头包括“Content-Type:text/html;charset=UTF-8”
  • 您确定调用了过滤器吗?症状表明它不是,或者setCharacterEncoding() 在稍后被覆盖。请注意,它仅在您没有事先调用 getParameter()getReader()getInputStream() 以及其他任何会触发解析请求正文的情况下才有效。
  • 啊,哈!在我的 setUtf8 用于分析之前运行了一个过滤器——它有一个隐藏的“getParameter()”我错过了。将其拆分为两个单独的过滤器,以便事先调用我的内容类型解决了这个问题。感谢您的帮助。
  • setCharacterEncoding 方法必须在 servlet 过滤器中调用。它必须在向服务器发出任何请求之前设置。
  • @BalusC:我们如何在处理 HTML 页面时执行以下操作?
猜你喜欢
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 2015-03-23
  • 2010-11-15
相关资源
最近更新 更多