url编码的字符被webflow/EL/JSF错误地解析

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.

我有什么想法开始寻找?

Bal*_*usC 6

我可以看到它是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元标题.