1. 什么是拦截器?
拦截器是java中动态拦截action调用的对象。它提供了一种机制,能够保证我们在action访问前后访问后进行增强。我们可以通过拦截器进行控制的访问,比如权限控制。拦截器引用的是AOP思想。而AOP的底层实现就是使用了动态代理。
并且在拦截其中使用的是责任链模式。在责任链模式中,很对对象由每一个对象对其下家的引用而连接起来形成一条链。在责任链每一个链点,都可以继续调用下一个节点,也可以阻止流程继续执行。
2. 拦截器的声明
struts2在struts-default.xml文件中声明了所有的拦截器。
而struts2框架默认使用的是defaultStack这个拦截器栈。而在这个拦截器栈中使用了18个拦截器。默认的情况下,struts2会加载这18个拦截器。
3. 自定义拦截器步骤
<1>创建一个类,实现com.opensymphony.xwork2.interceptor.Interceptor接口
在这个接口中,有三个方法,init方法、destory方法和intercept方法。其中,intercept才是真正实现拦截的方法。
在intercept方法中如果要向下继续执行,通过其参数ActionInvocation调用它的invoke()方法就可以。
如果想要对方法的执行进行终止,我们可以通过返回某个视图进行终止。视图就是result标签下的input、login等等5个视图。
<2>声明拦截器
找到struts-default.xml文件,在这个文件中对其进行声明。
//自己声明一个interceptor可以在struts.xml文件中声明
<interceptors>
<interceptor name="起个别称" class="全类名"/>
</interceptors>
<3>在action中指定使用哪些拦截器。
在action视图下,配置子标签<interceptor-ref name="别称"/>
注意:只要显示声明使用了一个拦截器。那么默认的拦截器就不在加载。
4. 怎样解决只控制action中某些方法的拦截?
1.创建类不在实现Interceptor接口,而是继承其下的一个子类.MethodFilterInterceptor,不用在重写intercept方法,而是重写 doIntercept方法。
2.在struts.xml文件中声明
<interceptors>
<intercept name="" class="">
<param name="includeMethods">add,update,delete(这些是要进行拦截的方法)</param>
<param name="excludeMethods">search(不进行拦截的方法)</param>
</intercept>
</interceptors>