使用RESTEasy进行错误的特殊字符编码

我正在开发一个使用jboss eap 6.3的web应用程序,它使用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èÃÃÃèèè”这样的东西,并且有jerseyrest框架,这个问题不存在。

我该怎么办?

谢谢

RESTEasy解决方案

由于RESTEasy使用servlet解释了对您的请求,因此最好使用servletfilter来设置请求字符编码:

 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应用程序设置charset?

JBoss解决方案

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

 /server/deploy/jbossweb.sar/server.xml 

或者在其他JBoss AS版本中:

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

设置连接器URIEncoding:

  

参考JBoss Seam文档:16.1国际化您的应用程序 。

通过更改JBoss AS 7及更高版本中的standalone.xml ,可以不同地完成此配置,如本答案中所述 (在JBossDeveloper论坛中也有回答)。

服务器独立解决方

由于以上是JBoss依赖的解决方案,如果不提供独立于服务器的解决方案,我的答案就不会完整。

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

  PARAMETER_ENCODING UTF-8  

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

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

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

数据库参与

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

为ASCII配置的数据库

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

字符编码JSP中的附加信息 – 在JSP中显示错误但在URL中没有显示错误,在HttpServletRequest中显示为Tomcat – setCharacterEncoding似乎什么都不做 。

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

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

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

  UTF-8