从源码入手:Filter与Interceptor

关于Filter与Interceptor的文章,多如牛毛!但是“每两篇文章中就能找到三个冲突(有差异)的知识点”。猿Why想找到官方“辟谣”,所以打算从源码入手,来看看二者。
文中只会介绍Filter和Interceptor各自可以做什么,不会说明二者的差异和不同(原因后文说明)。
API来源:
Filter:javax.servlet.Filter
Interceptor:org.springframework.web.servlet.HandlerInterceptor
可见,二者的来源是完全不一样的。前者来源(需要依赖)Web容器(比如Tomcat),后者则是Spring框架中的API,只依赖IOC容器。

API功能说明:
Filter:
从源码入手:Filter与Interceptor
理解:在客户端的请求访问后端资源之前,拦截这些请求。在服务器的响应发送回客户端之前,处理这些响应。
Interceptor:
从源码入手:Filter与Interceptor
理解:在请求执行链路上,允许自定义处理逻辑程序片段的工作流类型接口。应用程序中可以注册一系列已经存在的或者是自定义的拦截器用于处理一项事情,为真正的处理程序(执行方法)做统一的预处理,从而避免在每个处理方法中去实现。
API中方法介绍:
Filter:
public void doFilter (ServletRequest, ServletResponse, FilterChain)
该方法完成实际的过滤操作,当客户端请求方法与过滤器设置的URL匹配时,Servlet容器将先条用doFilter方法。
public void init(FilterConfig filterConfig)
在容器启动的时候,调用这个方法,对应的Filter进行初始化
public void destroy()
在容器关闭的时候,调用这个方法,对应的Filter进行资源销毁

Interceptor:
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler)
前置处理,需要说明的是,在有多个Interceptor的情况下,先按照顺序将所有的preHandle执行完
public void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,@Nullable ModelAndView)
后置处理,在perHandle方法,全部执行完成之后(并给返回结果为true)。postHandle方法,顾名思义-当请求处理之后,也就是Controller方法处理完后执行。但是它会在DispatcherServlet进行视图渲染返回渲染之前被调用。所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。postHandle方法调用的顺序与preHandle的调用顺序刚好相反。
public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,@Nullable Exception ex)
该方法需要在perHandle方法执行完后(无论是true还是false)才会执行。顾名思义-该方法在整个请求结束之后也就是DispatcherServlet渲染了对应的视图之后执行。

实现方式:
Filter:实现javax.servlet.Filter,并且注入的beanFactory
Interceptor:实现org.springframework.web.servlet.HandlerInterceptor,或者继承org.springframework.web.servlet.HandlerInterceptor的实现类,然后注册到容器中:WebMvcConfigurer#addInterceptors()

API使用场景与实例:
Filter:
1:Authentication Filters (身份验证过滤器)
2:Logging and Auditing Filters (日志记录和审核过滤器)
3:Image conversion Filters (图像转换过滤器)
4:Data compression Filters (数据压缩过滤器)
5:Encryption Filters (编码、加密)
6:Tokenizing Filters (标记化过滤器)
7:Filters that trigger resource access events (触发资源访问事件的Filter)
8:XSL/T filters (XSL/T 过滤器(XSL/T Filters),转换 XML 内容)
9:Mime-type chain Filter(MIME-TYPE 链过滤器)
Interceptor:
1:org.springframework.web.servlet.handler.MappedInterceptor 请求路径检查(最典型的一个应用场景)

Filter与Interceptor对比
从源码入手:Filter与Interceptor
理解:
1:HandlerInterceptor和Filter基本类似(在请求处理链路上,对请求前后进行处理)
2:HandlerInterceptor只允许执行自定义的预处理和后置处理
3:Filter的功能更强大,允许exchange(更换)请求和响应对象(对于这一条,尚未理解透彻,希望有缘人能帮忙解释)
4:filter是属于Servlet容器,例如Tomcat,而HandlerInterceptor属于Spring容器,filter在请求链路的更外层
作为基本准则:
1:与细粒度处理程序相关的预处理任务,HandlerInterceptor优先选择。特别是可以被排除在外(执行方法的外边)的统一处理和用户认证检查的代码。
2:Filter更适合request内容和响应显示内容处理,例如:multipart forms类型请求和GZIP 压缩。可以处理一些特定的请求(例如图片类型请求),也可以处理所有请求。