7

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

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

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

在我的 JSF 页面顶部:

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

如何在 JBoss AS 7 中解决同样的问题?或者更好,以更通用的方式使其适用于所有服务器?

4

3 回答 3

13

您链接到的问题已经排除了数据库编码的原因,因为在保存到数据库之前打印/重新显示提交的值期间已经发生了问题。因此,问题在于 HTTP 请求编码。

指定字符集的 JDBC 连接 URL,

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

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

带有指定字符集的 XML 序言,

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

仅告诉 XML 解析器在围绕它构建 XML 树之前使用 UTF-8 对 XML 源进行解码。实际使用的 XML 解析器是 Facelets 在 JSF 视图构建期间内部使用的 SAX。这部分与 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);
    }

    // ...
}
于 2013-07-14T20:14:50.233 回答
4

在标签中添加属性,在标签standalone.xml中添加属性。url-charset="UTF-8"http-listener name="default"default-encoding="UTF-8"servlet-container

于 2019-05-21T15:47:55.347 回答
2

添加这个来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获得

于 2014-11-14T20:33:55.110 回答