Spring中的字符集过滤器可以很方便的为我们解决项目中出现的中文乱码问题,而且使用方法也很简单,只需要在web.xml文件中配置一下该过滤器,设置两个重要的参数(encoding和forceEncoding)即可:
<!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码-->
<filter>
<filter-name>springUtf8Encoding</filter-name>
<filter-class>org.springframework.web.filter.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>
<filter-mapping>
<filter-name>springUtf8Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以下是Spring字符集过滤器的源码:
package org.springframework.web.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.Assert;
public class CharacterEncodingFilter extends OncePerRequestFilter
{
private String encoding;
private boolean forceEncoding = false;
public CharacterEncodingFilter()
{
}
public CharacterEncodingFilter(String encoding)
{
this(encoding, false);
}
public CharacterEncodingFilter(String encoding, boolean forceEncoding)
{
Assert.hasLength(encoding, "Encoding must not be empty");
this.encoding = encoding;
this.forceEncoding = forceEncoding;
}
public void setEncoding(String encoding)
{
this.encoding = encoding;
}
public void setForceEncoding(boolean forceEncoding)
{
this.forceEncoding = forceEncoding;
}
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse 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);
}
}
两个参数的作用
l
第一个方法setEncoding()相当于:ServletRequest.setCharacterEncoding(java.lang.String)
2.
第二个方法setForceEncoding()的作用是:
强制ServletResponse的编码格式和ServletRequest的编码格式一样。
也就是说,无论是request还是response,encoding设置了两者的编码格式,只不过forceEncoding默认值为false,此时就只是设置了request的编码格式,即在Servlet中:
request.setCharacterEncoding("XXXX");
如果设置forceEncoding的值为true时,相当于Servlet中:
request.setCharacterEncoding("XXXX");
response.setCharacterEncoding(“XXXX”);