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
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.
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过滤器去处理。