RESTEasy 的错误特殊字符编码

Bad special character encoding with RESTEasy

我正在开发一个使用 jboss eap 6.3 的 Web 应用程序,它使用 resteasy 休息框架,我遇到了一个错误的编码问题,在 POST 资源中作为 FormParam 传递的特殊字符,例如:

@POST
@Path("/post")
public Response createTask(@FormParam("param") String param) {
    LOGGER.info("HELLO POST XML. "+param);

    return Response.ok(param).build();

}

如果我传递像 abc èèè 这样的东西,我会得到像 "abc èà èà è" 这样的东西,对于 jersey rest 框架,这个问题不存在。

我该怎么办?

谢谢

RESTEasy解决方案

由于 RESTEasy 使用 servlet 为您解释请求,因此最好的办法是使用 servlet 过滤器来设置请求字符编码:

public class CharacterEncodingFilter implements javax.servlet.Filter {

  // ...

  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain filterChain) throws IOException, ServletException {
    request.setCharacterEncoding("UTF-8");
    filterChain.doFilter(request, response);
  }
}  

引用How to set charset for my web application?

JBoss解决方案

为确保应用服务器从客户端请求中接收到正确编码的请求参数,您必须配置连接器。对于 JBoss AS(版本 7 之前)更改:

<jboss_install>/server/deploy/jbossweb.sar/server.xml

或其他 JBoss AS 版本:

<jboss_install>/server/(default)/deploy/jboss-web.deployer/server.xml

设置连接器 URIEncoding:

<Connector port="8080" URIEncoding="UTF-8" />

参考JBoss Seam documentation: 16.1 Internationalizing your app.

通过更改 JBoss AS 7 及更高版本中的 standalone.xml 来完成此配置,如 this answer (also answered in JBossDeveloper forum).

服务器独立解决方案

由于以上是JBoss依赖的解决方案,如果不提供server-independent解决方案,我的回答将不完整。

最基本的方法是使用上下文参数指示应用程序中所有表单的字符编码选择。设置上下文参数在 WEB-INF/web.xml 文件中完成。

<context-param>
  <param-name>PARAMETER_ENCODING</param-name>
  <param-value>UTF-8</param-value>
</context-param>

然后您的应用程序可以读取上下文参数,并可以在读取任何请求参数之前设置请求字符编码。您可以在 Java Servlet 或 JSP 语法中设置请求编码:

<%
  String paramEncoding = application.getInitParameter("PARAMETER_ENCODING");
  request.setCharacterEncoding(paramEncoding);
  String name = request.getParameter("NAME");
%>

参考Character Conversions from Browser to Database.

数据库参与

您可能仍然需要设置数据库的字符编码,否则您可能会丢失信息,如下图所示:

参考Character Conversions from Browser to Database.

其他

更多信息在 Character encoding JSP -displayed wrong in JSP but not in URL and for Tomcat at HttpServletRequest - setCharacterEncoding seems to do nothing

你也可以set the default encoding for the JVM.

标题为“Text responses should default to charset UTF-8”的错误已在 RESTEasy 2.3.7 版中修复。

我刚刚在我的项目中声明了jboss-web.xml默认编码,这解决了问题

<jboss-web>
   <default-encoding>UTF-8</default-encoding>
</jboss-web>