将JSF输入提交值的请求字符编码设置为UTF-8



我遇到了与在GlassFish中将JSF输入提交值的请求字符编码设置为UTF-8相同的问题,提交的值以Mojibake的形式到达。然而,答案是针对GlassFish的,我使用的是JBoss AS7。

我已经指定JDBC连接URL使用UTF-8:

jdbc:mysql://localhost:3306/mydb?useUnicode=yes&characterEncoding=UTF-8

在我JSF页面的顶部:

<?xml version='1.0' encoding='UTF-8' ?>

如何在JBoss AS 7中解决相同的问题?或者更好,以一种更通用的方式,使其在所有服务器中都能工作?

您链接到的问题已经排除了DB编码的原因,因为在保存到DB之前打印/重新显示提交的值时已经出现了问题。因此,问题出在HTTP请求编码上。

指定字符集的JDBC连接URL,

jdbc:mysql://localhost:3306/mydb?useUnicode=yes&characterEncoding=UTF-8

只有告诉MySQL JDBC驱动程序在将SQL查询中的值发送到DB之前使用UTF-8对其进行解码。这不仅完全超出了JSF的范围,而且这也不是问题的原因,前提是你绝对肯定你有与链接问题中相同的问题。

指定字符集的XML prolog,

<?xml version='1.0' encoding='UTF-8' ?>

只有告诉XML解析器在构建XML树之前使用UTF-8对XML源进行解码。实际使用的XML解析器是SAX,这是Facelets在JSF视图构建时内部使用的。这部分与HTTP请求/响应编码完全无关,因此不太可能是问题的原因。

它们都没有设置HTTP请求编码,而您需要设置HTTP请求的编码。您链接到的问题已经显示了如何为Glassfish服务器做到这一点。然而,在您的案例中,您使用的是JBoss AS服务器。Glassfish特定的设置就不适用了,JBoss也不支持这样的设置。您需要引入一个自定义的servlet过滤器来完成这项工作。例如

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }
    // ...
}

standalone.xml中,在标记http-listener name="default"中添加atribute url-charset="UTF-8",在标记servlet-container中添加atributte default-encoding="UTF-8"

将此添加到JBOSS_HOME/standalone/configuration/standalone.xml中为我解决了问题:

<system-properties>
    <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
    <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/>
</system-properties>

来自https://developer.jboss.org/message/643825#643825

最新更新