我曾经在 GlassFish 服务器上运行我的 JavaEE 应用程序,编码类型(UTF-8)没有问题,因为我在服务器的 JVM 设置中添加了以下属性:
file.encoding = UTF-8
现在,我改用 WildFly 服务器,并且我已经完成了预期的配置,将编码类型设置为 UTF-8,但字符仍然以错误的编码出现,不仅在网页上,而且在使用 Eclipse 调试应用程序时也是如此,使用(Web Servlet 请求)加载的响应数据不是 UTF-8 编码的。 以下是我在 WildFly 上所做的:
Wildfly 现在使用 Undertow,因此请检查配置文件中的该子系统:
<subsystem xmlns="urn:jboss:domain:undertow:3.0">
<server name="default-server">
<http-listener name="default" socket-binding="http" redirect-socket="https" url-charset="UTF-8" />
</server>
<servlet-container default-encoding="UTF-8" name="default">
<jsp-config />
<websockets />
</servlet-container>
</subsystem>
设置
url-charset
和default-encoding
后,无需过滤器。
我认为,这些情况的解决方法是,您应该在 web.xml 中的 struts 过滤器之前实现一个过滤器并验证值。之后,您可以将 unicode 解码为过滤器,并创建一个拦截器来正确编码值。
这对我有用。
使用CharacterEncodingFilter(就像这个,取自Spring)强制使用UTF-8作为所有请求和响应的编码:
public class CharacterEncodingFilter implements Filter {
private String encoding;
private boolean forceEncoding;
@Override
public final void init(FilterConfig filterConfig) throws ServletException {
String encod = filterConfig.getInitParameter("encoding");
if(encod !=null){
encoding = encod ;
}
String forceEncod = filterConfig.getInitParameter("forceEncoding");
if(forceEncod !=null){
forceEncoding = forceEncod ;
}
}
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding) {
response.setCharacterEncoding(this.encoding);
}
}
filterChain.doFilter(request, response);
}
}
web.xml
<!-- Enforce UTF-8 Character Encoding -->
<filter>
<filter-name>charEncodingFilter</filter-name>
<filter-class>somepackages.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>