拦截器
什么是拦截器
拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
拦截器的生命周期
项目启动而创建,项目关闭而销毁
拦截器的创建
拦截器的创建一共分为三种方式,分别是实现Interceptor接口,继承AbstractInterceptor类和MethodFilterInterceptor类
拦截器的创建方式之一:实现Interceptor接口
实现Interceptor接口需要实现init()、destory()跟intercept()方法,其中intercept()接口是实现拦截器业务逻辑的方法
public class MyInterceptor implements Interceptor{ @override public void destory(){} @override public void init(){} @override public String intercept(ActionInvocation arg0) throws Exception{ return null; } }
拦截器的创建方式之二:继承AbstractInterceptor类
上一种方式虽然可以实现拦截器,但是在不需要init()跟destory()的时候仍旧需要实现init()跟destory()方法,不是很便利,那么第二种方式就出现了,这种方式是编写一个类(AbstractInterceptor)去实现Interceptor接口,并空实现init()跟destory()方法,仍旧将intercept()方法抽象,等待自己定义的拦截器类去实现
public class MyInterceptor extends AbstractInterceptor{ @override public String intercept(ActionInvocation invocation) throws Exception{ return null; } }
拦截器的创建方式三:继承MethodFilterInterceptor类
使用该方式实现拦截器可以定制拦截器拦截的方法,定制哪些方法需要拦截,哪些方法不需要拦截
public class MyInterceptor extends MethodFilterInterceptor{ @override protected String doIntercept(ActionInvocation invocation) throws Exception{ // 前处理 Systemoutprintln("前处理"); // 放行 invocation.invoke(); // 执行该方法后会进入下一个拦截器 // 后处理 System.out.println("后处理"); return “success”; 如果不打算放行可以直接返回字符串到相应的result标签所指向的页面 } }
拦截器如何配置
配置拦截器的方式分为三部,讲这三部定义在需要拦截的package下面即可
<interceptors> <!-- ① 注册拦截器 --> <interceptor name="myInterception" class="com.jinxin.intercept.MyInterceptor"></interceptor> <!-- ② 注册拦截器栈 --> <interceptor-stack name="myStack"> <!-- 引入自定义拦截器 --> <interceptor-ref name="myIntercaption"></interceptor-ref> <!-- 引入默认的20个拦截器 --> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- ③ 指定默认的拦截器栈,如果只想拦截器对某一个action起作用,那么将下面的代码放入相应的action标签即可 --> <default-interceptor-ref name="myStack"></default-interceptor-ref>
指定拦截器不拦截的方法
拦截器可以制定不拦截的方法,只需要在第二步的标签里面加入相应的参数即可
<interceptor-ref name="myIntercaption"> <param name="excludeMethods">add, delete</param> <!-- 指定了不拦截add跟delete方法 --> </interceptor-ref>
指定拦截器拦截的方法
既然可以指定不拦截哪些方法,那么自然就可以指定只拦截哪些方法,方法跟上面一致,只是参数改变成includeMethods
<interceptor-ref name="myIntercaption"> <param name="includeMethods">add, delete</param> <!-- 指定了拦截add跟delete方法 --> </interceptor-ref>