【问题标题】:url encoded character gets parsed wrongly by webflow/EL/JSFurl 编码的字符被 webflow/EL/JSF 错误解析
【发布时间】:2011-07-31 12:47:36
【问题描述】:

当我从网页提交字符 Ö 时,后端会收到 Ã。该网页是 Spring Webflow/JSF1.2/Facelets 应用程序的一部分。当我用萤火虫检查 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" />

调试时我可以看到导致错误解释的库是 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 应用程序中也有相同的症状。

知道我必须从哪里开始寻找吗?

【问题讨论】:

    标签: spring jsf character-encoding facelets spring-webflow


    【解决方案1】:

    我可以看到它是 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 响应标头,它指示网络浏览器应以什么字符集显示响应 以将参数发送回服务器。这显然已经正确设置,因为 POST 正文已正确编码。 HTML 元标题仅在用户将页面保存到本地磁盘并稍后从本地磁盘重新访问时使用。

    【讨论】:

    • 谢谢,我自己刚刚发现了 CharacterEncodingFilter,完美地完成了这项工作。对于可能遇到相同问题的人来说很重要,CharacterEncodingFilter 需要是第一个定义的过滤器。
    • 不客气。它不一定必须是第一个,它取决于其他过滤器的工作。如果您在读取请求正文或将请求转发到另一个 servlet(而不是继续该链)的链中有一些过滤器,那么这个过滤器肯定需要位于这些过滤器的前面。另请注意,可以对 URL 模式进行更多调整以匹配所有 HTML 页面的确切模式,这样它就不会不必要地在 images/css/js/etc 上运行。 *.jsf 也许?
    猜你喜欢
    • 2012-09-24
    • 2012-02-10
    • 2018-07-02
    • 2013-06-26
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多