Filter 与 interceptor 的区别
Filter
Filter
是Servlet
规范制定的,受Servlet
容器支持,接口定义在javax.servlet
包中。Filter
是被 Web Server(如Tomcat
)调用。Filter
需要在web.xml
中定义之后才会起作用。Filter
只在请求的前后起作用,Servlet
对于Filter
来说是一个黑盒。Filter
的执行顺序是:void init(FilterConfig)
- 容器在初始化Filter
时调用,在Filter
生命周期内仅会被调用一次。方法可以抛出ServletException
。doFilter(ServletRequest, ServletResponse, FilterChain)
- Web 容器每一次请求都会调用该方法。该方法将容器的请求和响应作为参数传递进来,FilterChain
用来调用下一个Filter
。void destroy()
- 当容器销毁 Filter 实例时调用该方法,可以在方法中销毁资源,该方法在 Filter 的生命周期只会被调用一次。
Interceptor
Interceptor
是Spring
容器内的,由Spring
框架提供支持。接口HandlerInterceptor
定义在org.springframework.web.servlet
包中。Interceptor
是被Spring
调用。Interceptor
可以深入到方法前后、异常抛出前后等,比起Filter
有更大的弹性。Interceptor
还允许用户介入请求的生命周期,可以在请求过程中获取信息,通常与请求更加耦合。Interceptor
的执行顺序是:- 请求到达
DispatcherServlet
DispatcherServlet
将请求发送至Interceptor
,Interceptor
执行preHandle()
方法- 请求到达
Controller
- 请求结束后,
Interceptor
执行postHandle()
方法
- 请求到达
参考文章
- Spring Interceptor vs Filter 拦截器和过滤器区别
- Spring Interceptor vs Filter - 掘金
- Chapter 10. Filters and Interceptors - Jersey 2.37 User Guide