拦截器

什么是拦截器

拦截器是动态拦截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>
posted @ 2018-07-23 20:02  Jin同学  阅读(237)  评论(0)    收藏  举报