一.过滤器和拦截器区别:
1 拦截器是基于java的反射机制
的,而过滤器是基于函数回调
。
2 过滤器是servlet规范规定的
,只能用于web程序中
,而拦截器是在spring容器中
,它不依赖servlet容器
。
3 过滤器可以拦截几乎所有的请求
(包含对静态资源的请求
),而拦截器只拦截action请求
(不拦截静态资源请求
)。
4 拦截器可以访问action上下文
、值栈里的对象
,而过滤器不能访问。
5 在action的生命周期中
,拦截器可以多次被调用
,而过滤器只能
在容器初始化时
被调用一次
。
6 拦截器可以获取IOC容器中的各个bean
,而过滤器就不行,这点很重要,在拦截器里注入一个service
,可以调用业务逻辑
。
7 拦截器是被包裹在过滤器之中
。
二.过滤器与拦截器执行顺序
SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。所以过滤器、拦截器、service()方法,dispatc()方法的执行顺序应该是这样的,大致画了个图:其实非常好测试,自己写一个过滤器,一个拦截器,然后在这些方法中都加个断点或者打印日志,一路F8下去就得出了结论。
三. 过滤器和拦截器的总结
1、过滤器(Filter)
:所谓过滤器顾名思义是用来过滤的
,Java的过滤器能够为我们提供系统级别的过滤
,也就是说,能过滤所有的web请求,这一点,是拦截器无法做到的。
2、监听器(Listener)
:Java的监听器,也是系统级别的监听
。监听器随web应用的启动而启动
。Java的监听器在c/s模式里面经常用到
,它会对特定的事件产生产生一个处理。监听在很多模式下用到,比如说观察者模式,就是一个使用监听器来实现的,在比如统计网站的在线人数。又比如struts2可以用监听来启动。Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
3、拦截器(Interceptor)
:java里的拦截器提供的是非系统级别的拦截
,也就是说,就覆盖面来说
,拦截器不如过滤器强大,但是更有针对性
。Java中的拦截器是基于Java反射机制
实现的,更准确的划分,应该是基于JDK实现的动态代理
。它依赖于具体的接口
,在运行期间
动态生成字节码
。拦截器 是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行 ,同时也提供了一种可以提取Action中 可重用部分代码 的方式。在AOP中,拦截器用于 在某个方法
或者字段被访问之前
,进行拦截然后再之前或者之后加入某些操作
。java的拦截器主要是用在插件上,扩展件上比如 Hibernate Spring Struts2等,有点类似面向切片的技术,在用之前先要在配置文件即xml,文件里声明一段的那个东西。
四.Java过滤器与SpringMVC拦截器原理与代码实现
参考下面两篇文章:
Java三大器之拦截器(Interceptor)的实现原理及代码demo: https://blog.csdn.net/reggergdsg/article/details/52962774
Java三大器之过滤器(Filter)的实现原理及代码demo: https://blog.csdn.net/reggergdsg/article/details/52821502