1
2
3 springUtf8Encoding
4 org.springframework.web.filter.CharacterEncodingFilter
5
6 encoding
7 UTF-8
8
9
10 forceEncoding
11 true
12
13
14
15 springUtf8Encoding
16 /*
17
注解配置:
@Bean
CharacterEncodingFilter characterEncodingFilter(){
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
spring源码
1 public classCharacterEncodingFilterextends OncePerRequestFilter {2
3 privateString encoding;4
5 private boolean forceEncoding = false;6
7
8 /**
9 * Set the encoding to usefor requests. This encoding will be passed into a10 * {@linkjavax.servlet.http.HttpServletRequest#setCharacterEncoding} call.11 *
Whether this encoding will overrideexisting request encodings12 * (and whether it will beapplied as default response encoding as well)13 * depends on the {@link#setForceEncoding "forceEncoding"} flag.14 */
15 public voidsetEncoding(String encoding) {16 this.encoding =encoding;17 }18
19 /**
20 * Set whether theconfigured {@link#setEncoding encoding} of this filter21 * is supposed to overrideexisting request and response encodings.22 *
Default is "false", i.e. do notmodify the encoding if23 * {@linkjavax.servlet.http.HttpServletRequest#getCharacterEncoding()}24 * returns a non-null value.Switch this to "true" to enforce the specified25 * encoding in any case,applying it as default response encoding as well.26 *
Note that the response encoding will onlybe set on Servlet 2.4+27 * containers, sinceServlet 2.3 did not provide a facility for setting28 * a default responseencoding.29 */
30 public void setForceEncoding(booleanforceEncoding) {31 this.forceEncoding =forceEncoding;32 }33
34
35 @Override36 protected voiddoFilterInternal(37 HttpServletRequest request, HttpServletResponse response,FilterChain filterChain)38 throwsServletException, 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过滤器去处理。