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

时间:2011-04-07 09:24:07

标签: spring jsf character-encoding facelets 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

字符Ö编码为%C3%96,使用this表我可以看到它是UTF-8 / Unicode字符Ö的正确十六进制表示。 但是当它到达后端时,角色会变成Ã。使用相同的表我可以看到有些代码试图分别解释C3和96(或作为unicode \ u表示法)。 U + 00C3恰好是Ã,96不是可见字符,因此可以解释这一点。

现在我知道这是编码不匹配的典型情况,我只是不知道在哪里修复此问题。

网页包含

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

调试时我可以看到负责错误interpration的库是jboss-el 2.0.0.GA,这似乎是正确的,因为该值在webflow表达式中被解析为后端:

<evaluate expression="rapportCriteria.addParameter('fw2', flowScope.fw2)" />

通过以下方式将其放在flowScope上:

<evaluate expression="requestParameters.fw2" result="flowScope.fw2"/>

没关系将表单输入到后端的精确方法,这是尝试将Webflow与BIRT报告集成的代码......但我在其他Web应用程序中使用了相同的sympton。

知道我必须开始寻找吗?

1 个答案:

答案 0 :(得分:6)

  

我可以看到它是UTF-8 / Unicode字符Ö的正确十六进制表示。但是当它到达后端时,角色会变成Ã。

因此,对POST主体进行编码的客户端字符编码是正确的,但服务器端字符编码不能解码POST主体。您需要创建一个Filter,它基本上在doFilter()方法

中执行以下操作
request.setCharacterEncoding("UTF-8");

并将其映射到感兴趣的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>

另见:


HTML元标题在问题上与此无关,在通过HTTP提供页面时会忽略它。它是HTTP响应头,它指示webbrowser在什么字符集中显示响应以将params发送回服务器。由于POST正文已正确编码,因此显然已经正确设置了这一点。仅当用户将页面保存到本地磁盘并稍后从本地磁盘重新访问时,才会使用HTML元标题。