Nic*_*rts 5 jsf spring facelets character-encoding spring-webflow
当我从网页上提交角色Ö后,后端收到了Ã.该网页是Spring Webflow/JSF1.2/Facelets应用程序的一部分.当我用firebug检查POST时,我看到:
Content-Type: application/x-www-form-urlencoded
Content-Length: 74
rapport=krediet_aanvragen&fw1=0&fw2=%C3%96ZTEKIN&fw3=0&fw4=0&zoeken=Zoeken
Run Code Online (Sandbox Code Playgroud)
字符Ö编码为%C3%96,使用此表我可以看到它是UTF-8/Unicode字符Ö的正确十六进制表示.但是当它到达后端时,角色会变成Ã.使用相同的表我可以看到有些代码试图分别解释C3和96(或作为unicode\u表示法).U + 00C3恰好是Ã,96不是可见字符,因此可以解释这一点.
现在我知道这是编码不匹配的典型情况,我只是不知道在哪里修复此问题.
该网页包含
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Run Code Online (Sandbox Code Playgroud)
在调试时,我可以看到负责错误interpration的库是jboss-el 2.0.0.GA,这似乎是正确的,因为该值被解析为webflow表达式中的后端:
<evaluate expression="rapportCriteria.addParameter('fw2', flowScope.fw2)" />
Run Code Online (Sandbox Code Playgroud)
它通过以下方式放到flowScope上:
<evaluate expression="requestParameters.fw2" result="flowScope.fw2"/>
Run Code Online (Sandbox Code Playgroud)
没关系将表单输入到后端的精确方法,这是试图将Webflow与BIRT报告集成的代码......但我在其他Web应用程序中有相同的sympton.
我有什么想法开始寻找?
我可以看到它是UTF-8/Unicode字符Ö的正确十六进制表示.但是当它到达后端时,角色会变成Ã.
因此客户端编码POST主体的字符编码是正确的,但服务器端字符编码不解码POST主体.您需要创建一个Filter
基本上在doFilter()
方法中执行以下操作的方法
request.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)
并将其映射到感兴趣的URL模式.Spring也提供了一个开箱即用,CharacterEncodingFilter
基本上就是上面做的.您需要做的就是将其添加到web.xml
:
<filter>
<filter-name>characterEncodingFilter</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>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
HTML元头在问题上是无关紧要的,当通过HTTP提供页面时,它被忽略.它是HTTP响应头,它指示webbrowser在什么字符集中显示响应并将 params发送回服务器.由于POST正文已正确编码,因此显然已经正确设置了这一点.仅当用户将页面保存到本地磁盘并稍后从本地磁盘重新访问时,才会使用HTML元标题.
归档时间: |
|
查看次数: |
2827 次 |
最近记录: |