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

带form-post和Spring控制器的UTF-8编码

连乐
2023-03-14

我正在尝试提交一个表单,其中包含UTF8字符。表单如下所示:

<form id="workflowPersistForm" accept-charset="UTF-8" method="post" action="/workflow-next">>
  <input id="stateGlobal" type="hidden" value=" お問い合わせ" name="state">
</form>

我的服务器是基于spring的。我的网络。xml已具有编码筛选器:

 <filter>
     <filter-name>EncodingFilter</filter-name>
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
     <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
     </init-param>
     <init-param>
         <param-name>forceEncoding</param-name>
         <param-value>true</param-value>
     </init-param>
 </filter>

问题是UTF-8字符在某处被搞砸了。我在控制器的开头放了一个断点,在这一点上角色本身就一团糟。此外,如果我在控制器内生成UTF8字符,它将在浏览器中正确渲染。只是在表单帖子上,控制器没有正确接收字符。

知道我可能做错了什么吗?

编辑:看起来,在新的页面中数据并没有被弄乱,而是被双重编码了。我无法理解为什么它是双重编码的。

编辑2:当我把表单改为get而不是post时,一切都很好。我不知道是什么帖子被打破了。

共有3个答案

叶鸿
2023-03-14

我建议您删除CharacterEncodingFilter,这可能是双重编码的原因。

要调试情景,您应该首先检查浏览器是否正确发布了数据。在Chrome(F12)上使用Firebug(Firefox)或开发者工具

最有可能的是,问题出在服务器端,你用的是哪个服务器?如果用Tomcat,需要在server.xml的Connector元素上设置CharsetEncode为UTF-8

更新1:

问题很可能是您正在设置的forceEncoding。根据文件

如果请求尚未指定编码,则此筛选器可以应用其编码,或者在任何情况下强制执行此筛选器的编码(“forceEncoding”=“true”)

在执行get时,没有指定编码,因此它可以正常工作。

然而,当您进行POST时,编码已经应用,然后(似乎)再次应用,因为forceEncoding=true

秦信瑞
2023-03-14

您的EncodingFilterweb.xml中是否有过滤器映射条目?

<filter-mapping>
  <filter-name>EncodingFilter</filter-name>
  <url-pattern>*</url-pattern>
</filter-mapping>
江雅懿
2023-03-14

看起来浏览器不会将字符集作为请求头中内容类型的一部分发送(即使设置了accept-charset-on-form),Tomcat会将这类请求体处理为拉丁语-1(http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q1 ).

因此,在稍后的时间点,这可能已被解码为Latin-1并编码为UTF-8,从而导致乱码字符。

将CharacterEncodingFilter移到顶部并强制将编码设置为UTF-8解决了这个问题。

 类似资料:
  • 我正在尝试提交一个包含UTF-8字符的表单。 问题是,在查询日志中,日语字符是乱码的,从响应来看,它们似乎是双重编码的(UTF-8)。 如果我使用GET而不是POST,一切都会正常。谁能帮帮我吗?这在哪里得到双重编码?我该怎么修?

  • 我的UTF-8编码有问题。我的webapp使用法语单词,这些单词在我的jsp中正确显示,但在发布后不会显示在我的控制器中。例如,在我的jsp中,我有: Prénom de mon père 当我发布表单时,控制器得到: Prénom de mon père characterEncodingFilter是文件中的第一个过滤器,如本文所述 这是我的jsp: 我的网络。xml: 和我的应用程序配置

  • 问题内容: 我们尝试在Windows上使用Java和UTF-8。该应用程序在控制台上写入日志,我们希望对日志使用UTF-8,因为我们的应用程序具有国际化的日志。 可以配置JVM,使其使用JVM的参数生成UTF-8 。它工作正常,但Windows控制台上的输出出现乱码。 然后,我们可以将控制台的代码页设置为65001(),但是在这种情况下,文件将无法工作。这意味着当我们尝试通过脚本(名为start.

  • 问题内容: 目前,我正在尝试开始使用Spring MVC。在尝试时,我遇到了编码问题。 我想在我的JSP页面上显示UTF-8字符,所以我在ModelAndView中添加了一个带有UTF-8字符的字符串。看起来像这样: 在JSP页面上,我只想显示具有UTF-8字符的字符串,如下所示: 结果,我得到以下结果: 请注意,下面的代码显示没有编码错误。我还在Springsource Tool Suite中将

  • 我正在评估与thymeleaf模板引擎的Spring启动。我正面临UTF8字符表单张贴问题。 对于最简单的post示例: 在控制器中: 在本例中,Spring MVC(或thymeleaf)无法正确编码具有UTF-8字符的表单。 如果我输入,我将看到以下日志: 应编码为。正文应该是,但我不知道为什么它会变成,并被解码成错误的字符。 我在谷歌上搜索并找到了一些解决方案,比如添加一个编码过滤器: 但不

  • 然而,这些都无济于事。 仍然没有正确保存字符。