spring中的字符集过滤器能够很方便的为咱们解决项目中出现的中文乱码问题,并且使用方法也很简单,只须要在web.xml文件中配置一下该过滤器,设置两个重要的参数(encoding和forceEncoding)便可:java
<!-- 配置请求过滤器,编码格式设为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字符集过滤器的源码:web
public class CharacterEncodingFilterextends OncePerRequestFilter { private String encoding; private boolean forceEncoding = false; /** * Set the encoding to usefor requests. This encoding will be passed into a * {@link javax.servlet.http.HttpServletRequest#setCharacterEncoding} call. * <p>Whether this encoding will overrideexisting request encodings * (and whether it will beapplied as default response encoding as well) * depends on the {@link #setForceEncoding "forceEncoding"} flag. */ public void setEncoding(String encoding) { this.encoding = encoding; } /** * Set whether theconfigured {@link #setEncoding encoding} of this filter * is supposed to overrideexisting request and response encodings. * <p>Default is "false", i.e. do notmodify the encoding if * {@link javax.servlet.http.HttpServletRequest#getCharacterEncoding()} * returns a non-null value.Switch this to "true" to enforce the specified * encoding in any case,applying it as default response encoding as well. * <p>Note that the response encoding will onlybe set on Servlet 2.4+ * containers, sinceServlet 2.3 did not provide a facility for setting * a default responseencoding. */ public void setForceEncoding(boolean forceEncoding) { this.forceEncoding = forceEncoding; } @Override 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); } }
由源码能够知道,该字符集过滤器有两个重要参数,分别是encoding和forceEncoding,这两个参数分别有什么做用呢?如下是参考文档的介绍:spring
setEncoding public voidsetEncoding(Java.lang.String encoding) Set the encodingto use for requests. This encoding will be passed into aServletRequest.setCharacterEncoding(java.lang.String) call. setForceEncoding public voidsetForceEncoding(boolean forceEncoding) Set whether theconfigured encoding of this filter is supposed to override existing request andresponse encodings.
经过参考文档,咱们能够知道:app
1.第一个方法setEncoding()至关于:ServletRequest.setCharacterEncoding(java.lang.String)
ide
2.第二个方法setForceEncoding()的做用是:强制ServletResponse的编码格式和ServletRequest的编码格式同样。
this
也就是说,不管是request仍是response,encoding设置了二者的编码格式,只不过forceEncoding默认值为false,此时就只是设置了request的编码格式,即在Servlet中:编码
request.setCharacterEncoding("XXXX"); url
若是设置forceEncoding的值为true时,至关于Servlet中:spa
request.setCharacterEncoding("XXXX");.net
response.setCharacterEncoding(“XXXX”);
如今咱们回过头来看看最初给你们看的web.xml中那部分过滤器的配置,相信你们都明白了,配置的做用至关于Servlet中的:
@RequestMapping(value="XXXXX") public void XXXXX(User user,HttpServletRequestreq,HttpServletResponse resp) throws UnsupportedEncodingException { resp.setCharacterEncoding("UTF-8"); req.setCharacterEncoding("UTF-8"); ...... }
所以,在请求处理的过程当中咱们能够不用考虑编码方面的问题,上面两句代码能够省略,编码统一交给Spring过滤器去处理,咱们能够专心处理咱们的业务逻辑代码,这就是Spring字符集过滤器的方便之处。