拦截器的概念
java中的拦截器时动态的拦截Action调用的对象,它提供了一种机制,可以使开发者在一个Action执行的前后执行一段代码,也可以在Action执行前阻止其执行,同事也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截,然后在之前之后进行拦截进行某种操作
拦截器
目前主要应用拦截器:Spring的拦截器,Struts2的拦截器(知道即可)
拦截器原理
- 大部分时候拦截器方法都是通过代理的方式来调用的
- Struts2的拦截器相当简单,当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件,并根据配置实例化拦截器对象,然后串成一个列表,最后一个个的调用列表中的拦截器
- Struts2的拦截器是可插拔的,拦截器是AOP的一个实现,Struts2的拦截器栈就是将拦截器按一定的顺序连接成一个链,
- 在访问被拦截的方法或者字段时,Struts2拦截器链中的拦截器按顺序执行。
如何实现拦截器
- 自定义一个普通类,实现interceptor接口,或者继承抽象类AbstractInterceptor
- 在配置文件中,注册定义得拦截器
- 在需要Action得地方引用上述定义得拦截器,为了更方便得将拦截器定义为默认得拦截器,这样在不加特殊得情况下,所有得Action,都会被这个拦截器拦截
过滤器和拦截器的区别
过滤器可以简单的理解为“取你所取”,过滤器关注点在于web请求;拦截器可以理解为”拒你所拒“。拦截器关注的点在于方法的调用。
- 拦截器是基于java的反射机制来实现,而过滤器是基于函数回调实现的(也有人说拦截器是基于动态代理来实现的)
- 拦截器不依赖servlet容器,而过滤器依赖于servlet容器
- 拦截器只对Action起作用,而过滤器可以对所有的请求起作用
- 拦截器可以访问Action上下文和值栈的对象,而过滤器不能
- 在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化的时候调用一次