字节编码过滤器 CharacterEncodingFilter
是 spring 内置过滤器的一种,用来指定请求或者响应的编码格式。在 web 开发中经常被从来使用。
1、CharacterEncodingFilter 的用法
<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>forceRequestEncoding</param-name>
<param-value>true</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>
其中 encoding 用来指定编码格式,forceEncoding 表示是否强制 response 的编码格式也是 encoding 格式。
public class CharacterEncodingFilter extends OncePerRequestFilter {
@Nullable
private String encoding;
private boolean forceRequestEncoding;
private boolean forceResponseEncoding;
...
2、CharacterEncodingFilter 原理
服务器启动的时候就会创建 Filter,将 <init-param>
中的参数加载,注入到 CharacterEncodingFilter 类中,浏览器每次发送请
求都会经过这个过滤器,然后调用 doFilterInternal()
。
CharacterEncodingFilter 继承关系图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9vGuQ0Bq-1646188911999)(素材/CharacterEncodingFilter 继承关系图.png)]
可以看到 CharacterEncodingFilter 继承 OncePerRequestFilter,OncePerRequestFilter 是个抽象类,其中的抽象方法doFilterInternal 被 CharacterEncodingFilter 实现,同时 OncePerRequestFilter 实现了 doFilter()
方法,调用了 doFilterInternal()
方法。
doFilterInternal()
方法:
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);
}