Java三⼤器之(Interceptor)的实现原理及代码⽰例
1,的概念
java⾥的是动态拦截Action调⽤的对象,它提供了⼀种机制可以使开发者在⼀个Action执⾏的前后执⾏⼀段代码,也可以在⼀个Action
执⾏前阻⽌其执⾏,同时也提供了⼀种可以提取Action中可重⽤部分代码的⽅式。在AOP中,⽤于在某个⽅法或者字段被访问之前,进⾏拦截
然后再之前或者之后加⼊某些操作。⽬前,我们需要掌握的主要是Spring的,Struts2的不⽤深究,知道即可。
2,的原理
⼤部分时候,⽅法都是通过代理的⽅式来调⽤的。Struts2的实现相对简单。当请求到达Struts2的ServletDispatcher
时,Struts2
会查配置⽂件,并根据配置实例化相对的对象,然后串成⼀个列表(List),最后⼀个⼀个的调⽤列表中的。Struts2的是可springboot和过滤器
插拔的,是AOP的⼀个实现。Struts2栈就是将按⼀定的顺序连接成⼀条链。在访问被拦截的⽅法或者字段时,Struts2链
中的就会按照之前定义的顺序进⾏调⽤。
3,⾃定义的步骤
第⼀步:⾃定义⼀个实现了Interceptor接⼝的类,或者继承抽象类AbstractInterceptor。
第⼆步:在配置⽂件中注册定义的。
第三步:在需要使⽤Action中引⽤上述定义的,为了⽅便也可以将定义为默认的,这样在不加特殊说明的情况下,所有的
Action都被这个拦截。
4,过滤器与的区别
过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;可以简单的理解为“拒你所想拒”,关注的是⽅法调⽤,⽐如拦截
敏感词汇。
4.1,是基于java反射机制来实现的,⽽过滤器是基于函数回调来实现的。(有⼈说,是基于动态代理来实现的)
4.2,不依赖servlet容器,过滤器依赖于servlet容器。
4.3,只对Action起作⽤,过滤器可以对所有请求起作⽤。
4.4,可以访问Action上下⽂和值栈中的对象,过滤器不能。
4.5,在Action的⽣命周期中,可以多次调⽤,⽽过滤器只能在容器初始化时调⽤⼀次。