RESTEasy存在特殊字符编码问题

3

我正在使用jboss eap 6.3开发一个网络应用程序,它使用resteasy rest框架。在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框架,这个问题不存在。

我应该怎么办?

谢谢。


寻找控制字符编码的方法 - 我建议从更改请求的字符编码开始,就像这样:https://dev59.com/aHRB5IYBdhLWcg3wJUau - gknicker
但是这样做,我需要强制客户端(可能是任何类型的任何地方)检查其请求,即使我使用Chrome高级Rest客户端插件也会出现此错误!由于这似乎是一个RestEasy问题,所以我只能考虑服务器端的解决方案。 - Michele Bortolato
2个回答

5

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);
  }
}  

参考 如何为我的Web应用程序设置字符集?

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国际化您的应用程序

在JBoss AS 7及更高版本中,通过更改 standalone.xml 来完成此配置,例如this answer (也可以在 JBossDeveloper forum中找到答案)。

服务器独立解决方案

由于以上是基于JBoss的解决方案,如果不提供一个服务器独立的解决方案,我的答案将不完整。

最基本的方法是使用上下文参数来指示应用程序中所有表单的字符编码选择。设置上下文参数是在 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");
%>

参考 从浏览器到数据库的字符转换

数据库的涉及

您可能仍然需要设置数据库的字符编码,否则您可能会丢失信息,就像这个图表中所示:

Database configured for ASCII

参考 从浏览器到数据库的字符转换

杂项

更多信息请参见JSP字符编码-JSP中显示错误但URL没有和适用于Tomcat的HttpServletRequest-setCharacterEncoding似乎没有任何作用

您还可以设置JVM的默认编码

在RESTEasy版本2.3.7中修复了一个名为“文本响应应默认为charset UTF-8”的错误。


JBoss配置仅影响URI参数 - 在URI中传递的参数,例如/something?foo=bar,但不影响请求正文中传递的URL编码参数(FormParams)。 - lefloh
2
谢谢,我解决了,只需添加一个过滤器,将字符编码设置为utf-8,如上所示。 - Michele Bortolato
很高兴听到那对你有用。请接受我的答案,如此处所示:http://meta.stackexchange.com/a/5235/236612 - gknicker

3

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接