SpringMVC--CharacterEncodingFilter

394 阅读1分钟

一什么是CharacterEncodingFilter

是spring内置过滤器的一种,用来指定请求或者响应的编码格式。在web开发中经常被从来使用

用法

在web.xml中配置好即可

<filter>
  <filter-name>CharacterEncodingFilter</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>forceResponseEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CharacterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

源码

这里有三个参数,@Nullable表示可以为空,可以不穿,我们传了就用传入的UTF-8,下边两个参数分别是请求和响应的编码是否设置的Boolean变量

public class CharacterEncodingFilter extends OncePerRequestFilter {
    @Nullable
    private String encoding;
    private boolean forceRequestEncoding;
    private boolean forceResponseEncoding;

既然是一个过滤器我们就要找他的doFilter方法,看他的父类OncePerRequestFilter的doFilter方法会集成给CharacterEncodingFilter,每当执行时都回去找这个方法

public class CharacterEncodingFilter extends OncePerRequestFilter 

他的doFilter方法中做了

this.doFilterInternal(httpRequest, httpResponse, filterChain);

那我们在回来看这个doFilterInternal方法,其实看他的参数就可以了FilterChain就知道这个是执行过滤的方法

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String encoding = this.getEncoding();
    if (encoding != null) {
        if (this.isForceRequestEncoding() || request.getCharacterEncoding() == null) {
            request.setCharacterEncoding(encoding);
        }

        if (this.isForceResponseEncoding()) {
            response.setCharacterEncoding(encoding);
        }
    }

    filterChain.doFilter(request, response);
}

显示获取我们传入的encoding,不等于空就进来,然后一个判断我们第一个参数是false,第二个参数获取编码,饿哦没没有设置过,所以后边为true,进来之后,设置reques请求编码为我们传入的,第二个判断是相应是否为true,我们设置了为true进去设置响应也为UTF-8 搞定