一、什麼是CharacterEncodingFilter
官方解釋如下
是spring內置過濾器的一種,用來指定請求或者響應的編碼格式。在web開發中經常被從來使用
二、CharacterEncodingFilter的用法
在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>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其中encoding用來指定編碼格式,forceEncoding表示是否強制response的編碼格式也是encoding格式
三、CharacterEncodingFilter 原理
服務器啓動的時候就會創建Filter,將init-param中的參數加載,注入到CharacterEncodingFilter 類中,瀏覽器每次發送請求都會經過這個過濾器,然後調用doFilterInternal
CharacterEncodingFilter 類圖
可以看到CharacterEncodingFilter繼承OncePerRequestFilter,OncePerRequestFilter是個抽象類,其中的抽象方法doFilterInternal被CharacterEncodingFilter實現,同時OncePerRequestFilter實現了doFilter方法,調用了doFilterInternal方法。
doFilterInternal方法
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding) {
response.setCharacterEncoding(this.encoding);
}
}
filterChain.doFilter(request, response);
}