作者:渐我素小黑陈琼敏 | 来源:互联网 | 2023-05-26 15:39
我正在使用jboss eap 6.3开发一个使用resteasy rest框架的web应用程序,我在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èÃÃÃèèè"这样的东西,并且有球衣休息框架,这个问题不存在.
我该怎么办?
谢谢
1> gknicker..:
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应用程序设置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国际化您的应用程序.
通过standalone.xml
在JBoss AS 7及更高版本中进行更改来完成此配置,如本答案中所述(在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");
%>
从浏览器到数据库的参考字符转换.
Database involvement
You may still have to set the character encoding of your database, otherwise you can lose information as in this diagram:

Reference Character Conversions from Browser to Database.
Miscellaneous
Additional information at Character encoding JSP -displayed wrong in JSP but not in URL and for Tomcat at HttpServletRequest - setCharacterEncoding seems to do nothing.
You can also set the default encoding for the JVM.
A bug titled "Text responses should default to charset UTF-8" was fixed in RESTEasy version 2.3.7.
谢谢,我解决方案只需添加一个过滤器,设置为utf-8字符编码,如上所示