0x01 区别

1. 实现原理不同

过滤器和拦截器 底层实现方式不相同,过滤器是基于函数回调的,拦截器则是基于Java的反射机制(动态代理)实现的。

2. 使用范围不同

过滤器实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。

而拦截器是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。

3. 触发时机不同

过滤器 和 拦截器的触发时机不同。

img

如上图所示,过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。

拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。

4. 拦截的请求范围不同

Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强。

0x02 使用场景

过滤器对所有请求都生效,更加适合做一些通用功能。

拦截器可以细粒度地控制拦截路径,适合做一些偏重业务地功能。

1. 过滤器使用场景

spring security就是使用的过滤器,因为作为一个通用的安全框架不应该耦合其他web框架的元素。很显然拦截器是spring mvc或struts等框架提供的,如果基于拦截器势必耦合这些框架,就做不到通用了。

2. 拦截器使用场景

mybatis plus的分页查询就是基于拦截器实现的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐