过滤器(filter)和拦截器(Interceptor)的区别以及使用场景
过滤器实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。过滤器和拦截器 底层实现方式不相同,过滤器
0x01 区别
1. 实现原理不同
过滤器和拦截器 底层实现方式不相同,过滤器是基于函数回调的,拦截器则是基于Java的反射机制(动态代理)实现的。
2. 使用范围不同
过滤器实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。
而拦截器是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。
3. 触发时机不同
过滤器 和 拦截器的触发时机不同。
如上图所示,过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。
4. 拦截的请求范围不同
Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强。
0x02 使用场景
过滤器对所有请求都生效,更加适合做一些通用功能。
拦截器可以细粒度地控制拦截路径,适合做一些偏重业务地功能。
1. 过滤器使用场景
spring security就是使用的过滤器,因为作为一个通用的安全框架不应该耦合其他web框架的元素。很显然拦截器是spring mvc或struts等框架提供的,如果基于拦截器势必耦合这些框架,就做不到通用了。
2. 拦截器使用场景
mybatis plus的分页查询就是基于拦截器实现的。
更多推荐
所有评论(0)