Spring 配置请求过滤器,编码格式设为UTF-8,避免中文乱码
1 <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--> 2 <filter> 3 <filter-name>springUtf8Encoding</filter-name> 4 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 5 <init-param> 6 <param-name>encoding</param-name> 7 <param-value>UTF-8</param-value> 8 </init-param> 9 <init-param> 10 <param-name>forceEncoding</param-name> 11 <param-value>true</param-value> 12 </init-param> 13 </filter> 14 <filter-mapping> 15 <filter-name>springUtf8Encoding</filter-name> 16 <url-pattern>/*</url-pattern> 17 </filter-mapping>
注解配置:
@Bean CharacterEncodingFilter characterEncodingFilter(){ CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); return filter; }
spring源码
1 public class CharacterEncodingFilterextends OncePerRequestFilter { 2 3 private String encoding; 4 5 private boolean forceEncoding = false; 6 7 8 /** 9 * Set the encoding to usefor requests. This encoding will be passed into a 10 * {@link javax.servlet.http.HttpServletRequest#setCharacterEncoding} call. 11 * <p>Whether this encoding will overrideexisting request encodings 12 * (and whether it will beapplied as default response encoding as well) 13 * depends on the {@link #setForceEncoding "forceEncoding"} flag. 14 */ 15 public void setEncoding(String encoding) { 16 this.encoding = encoding; 17 } 18 19 /** 20 * Set whether theconfigured {@link #setEncoding encoding} of this filter 21 * is supposed to overrideexisting request and response encodings. 22 * <p>Default is "false", i.e. do notmodify the encoding if 23 * {@link javax.servlet.http.HttpServletRequest#getCharacterEncoding()} 24 * returns a non-null value.Switch this to "true" to enforce the specified 25 * encoding in any case,applying it as default response encoding as well. 26 * <p>Note that the response encoding will onlybe set on Servlet 2.4+ 27 * containers, sinceServlet 2.3 did not provide a facility for setting 28 * a default responseencoding. 29 */ 30 public void setForceEncoding(boolean forceEncoding) { 31 this.forceEncoding = forceEncoding; 32 } 33 34 35 @Override 36 protected void doFilterInternal( 37 HttpServletRequest request, HttpServletResponse response,FilterChain filterChain) 38 throws ServletException, IOException { 39 40 if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) { 41 request.setCharacterEncoding(this.encoding); 42 if (this.forceEncoding) { 43 response.setCharacterEncoding(this.encoding); 44 } 45 } 46 filterChain.doFilter(request, response); 47 } 48 }
该字符集过滤器有两个重要参数,分别是encoding和forceEncoding
setEncoding
public void setEncoding(java.lang.String encoding)
Set the encodingto use for requests. This encoding will be passed into aServletRequest.setCharacterEncoding(java.lang.String) call.
setForceEncoding
public void setForceEncoding(boolean forceEncoding)
Set whether theconfigured encoding of this filter is supposed to override existing request andresponse encodings.
通过参考文档,我们可以知道:
l.
第一个方法setEncoding()相当于:ServletRequest.setCharacterEncoding(java.lang.String),即设置request编码格式。
2.
第二个方法setForceEncoding()的作用是:
同时设置ServletResponse和ServletRequest的编码格式。
配置相当于代码中:
resp.setCharacterEncoding("UTF-8"); req.setCharacterEncoding("UTF-8");
在请求处理的过程中我们可以不用考虑编码方面的问题,上面两句代码可以省略,编码统一交给Spring过滤器去处理。