【问题标题】:Servlet character encoding issue with JPAJPA 的 Servlet 字符编码问题
【发布时间】:2014-01-30 20:11:32
【问题描述】:

好的,我已经花了 三个 七个小时的谷歌搜索和测试,我放弃了,我不得不寻求帮助。 我以前在 Linux 上开发,一切都很简单,现在我使用 windows,设置正确的语言环境这样简单的事情不起作用。

我用表单创建了简单的 JSP:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<form action="save-user" method="post">
    Name: <input type="text" name="name"><br>
    Email: <input type="text" name="email"><br>
    <input type="submit" value="Save">
</form>

和 Servlet:

    String name = request.getParameter("name");
    String email = request.getParameter("email");

我收到的是 LeoÅ¡ 而不是 Leoš。我使用 WildFly 8.0RC1、Windows 8 czech、firefox。

我已经尝试过的:

  1. request.setCharacterEncoding("UTF-8");在先阅读之前 参数
  2. 使用 request.setCharacterEncoding("UTF-8"); 过滤
  3. JVM 属性 -Dfile.encoding=UTF-8
  4. 从战争中移除标准 JEE 堆栈 jar
  5. 修复战争包装
  6. 将项目拆分为 WEB 和 EJB 模块

部署 JPA 实体/DAO 时,变音符号会被破坏。如果我从 servlet 中注释掉实体并从战争中删除 JPA 实体(当前从 WEB-INF/lib 中删除 OAuthLoginEJB.jar),那么我会收到正确的编码。如果我重新添加这个 EJB,那么它会再次失败。是 JBoss / WildFly 错误吗?

我可以提供完整的来源:https://drive.google.com/file/d/0B-adlc5KThQDWTdYOEwxOUpTVEU/edit?usp=sharing 它已准备好运行,您甚至不需要输入捷克字母,因为它们已预先填写。谢谢

【问题讨论】:

  • 不确定是否是这种情况,但您的项目是否配置为在 IDE 中使用 UTF-8?
  • 想法显示文件是UTF8编码的
  • @SotiriosDelimanolis 我认为情况并非如此。有一个过滤器,我觉得很有趣,request.getCharacterEncoding() == null 就在 request.setCharacterEncoding("UTF-8") 之后。它似乎没有任何效果。我想我会将它部署到不同的容器中以验证它不是 Wildfly 错误。
  • 你遇到WFLY-2531了吗?

标签: java servlets character-encoding cdi wildfly


【解决方案1】:

WildFly 开发邮件列表中的 Marko 向我指出了这个缺陷:https://issues.jboss.org/browse/CDI-411 和这个解决方法:http://weld.cdi-spec.org/documentation/#3

当我修改我的 web.xml 时,它开始工作了:

<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>cz.literak.demo.oauth.servlets.EncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
        <filter-name>CDI Conversation Filter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

【讨论】:

    【解决方案2】:

    在第一次读取请求 InputStream 之前,您需要调用 request.setCharacterEncoding("UTF-8")。在您在 servlet 中设置编码之前,过滤器可以读取参数。 OAuthLoginEJB.jar 或其他依赖项中可能有一些过滤器,它首先读取参数?通常,这是一些用于调试的参数... 使用 Servlet API 3.0,可以通过注解注册 servlet 和过滤器,因此尽管web.xml 为空,也可以注册一些过滤器。

    【讨论】:

    • 看源码,很原始的应用。我刚刚在调试过程中意识到该请求已经在我的过滤器中包含填充的 parsedData 属性。我可以在调用堆栈中看到其他一些过滤器,我会下载源代码来看看它是什么。
    猜你喜欢
    • 2012-10-28
    • 2019-07-05
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多