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](https://istack.dev59.com/ZnOKx.webp)
参考 从浏览器到数据库的字符转换。
杂项
更多信息请参见JSP字符编码-JSP中显示错误但URL没有和适用于Tomcat的HttpServletRequest-setCharacterEncoding似乎没有任何作用。
您还可以设置JVM的默认编码。
在RESTEasy版本2.3.7中修复了一个名为“文本响应应默认为charset UTF-8”的错误。