我正在开发一个使用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èÃÃÃèèè”这样的东西,这个问题不存在于球衣休息框架中。
我该怎么办?
由于
答案 0 :(得分: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);
}
}
参考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中一样(也在JBossDeveloper forum中回答)。
独立于服务器的解决方案
由于以上是JBoss依赖的解决方案,如果不提供独立于服务器的解决方案,我的答案就不会完整。
最基本的是使用context参数指示应用程序中所有表单的字符编码选择。设置上下文参数在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的其他信息以及HttpServletRequest - setCharacterEncoding seems to do nothing的Tomcat的其他信息。
您也可以set the default encoding for the JVM。
标题为&#34; Text responses should default to charset UTF-8&#34;的错误已在RESTEasy版本2.3.7中修复。