Spring 配置请求过滤器,编码格式设为UTF-8,避免中文乱码

时间:2022-07-24
本文章向大家介绍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 }

该字符集过滤器有两个重要参数,分别是encodingforceEncoding

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()的作用是:同时设置ServletResponseServletRequest的编码格式。

配置相当于代码中:

resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");

在请求处理的过程中我们可以不用考虑编码方面的问题,上面两句代码可以省略,编码统一交给Spring过滤器去处理。