JFinal中的拦截器配置

版权声明: https://blog.csdn.net/qq_33323054/article/details/82218684

    在布置项目时,我们都希望工程中的信息只向一部分人可见,对于没有经过许可的访客,我们更希望能有选择地拒绝对方的访问,在这里就需要使用到拦截器Interceptor。拦截器的作用是对action的请求进行拦截处理,在向指定访客展示网站信息的同时,将未经许可的请求拦截下来。

    在JFinal中拦截器的拦截粒度分为如下几个等级,并且拦截器各级别的执行次序也以此排序:Global、Inject、Class、Method。如果在同级别中有多个拦截器,则在同级别中配置在前面的先执行。

Before

    在拦截器的配置中,需要使用到Before注解,它可以配置Class、Method级别的拦截器,示例代码如下。其中,Before中可以配置多个拦截器,只需要在大括号内用逗号隔开就行了,代码中已给出示例。

//Class级别的拦截器,将拦截本类中的所有方法
@Before(ClassInterceptorA.class)
public class InterControllerA extends Controller{

    //Method级别的拦截器,仅拦截本方法
    @Before({MethodInterceptorA.class,MethodInterceptorB.class})
    public void functionA(){
        //该方法会被三个拦截器拦截,且顺序分别为
        //ClassInterceptorA.class,MethodInterceptorA.class,MethodInterceptorB.class
    }

    //未配置拦截器的方法
    public void functionB(){
        //该方法不会被Method级别拦截器拦截,但会被Class级别拦截器拦截
    }
}

    而在相应的拦截器中,我们需要进行如下配置,配置之后的Class拦截器就会对上面的类进行拦截:

public class ClassInterceptorA implements Interceptor{
    public void intercept(Invocation inv){
        System.out.println("调用前的操作");
        inv.invoke();
        System.out.println("调用后的操作");
    }
}

    其中inv.invoke()就是调用目标方法的位置,而拦截器可以分别在调用前和调用后插入相应的代码。

    Before可以将拦截器配置为Class与Methos级别,如果要配置为Global级别,则需要在JFinalConfig类中进行配置。这是一个继承自JFinalConfig的子类,所有的JFinal项目都会有这样一个子类以对整个web项目进行配置。这个子类中需要实现多个抽象方法,其中一个就是对全局拦截器的配置,方法名为configInterceptor()。

public class MyJFinalConfig extends JFinalConfig {
   public void configInterceptor(Interceptors me) {
      // 添加全局拦截器
      me.add(new GlobalInterceptorA());
      me.add(new GlobalInterceptorB());
      me.add(new GlobalInterceptorC());
   }
}

Clear

    Clear是用于清除拦截器对方法的拦截。在上面我们有提到拦截器从上到下分为Global、Inject、Class、Method四个层次,Clear可以用于清除自身所处层次以上的拦截器。如:声明在Method层的Clear将清除Global、Inject、Class层的拦截、声明在Class层的Clear将清除Global、Inject层的拦截。

    另外,Clear不带参数时,清除范围内所有的拦截器,带参数时,清除参数指定的拦截器

@Before(InterceptorA.class)
public class UserController extends Controller {
    @Clear
    @Before(InterceptorB.class)
    public void login() {
        //Global、 Class级别的拦截器将被清除,但本方法上声明的InterceptorB不受影响
    }
    @Clear({InterceptorA.class, InterceptorC.class})// 清除指定的拦截器AAA与CCC
    @Before(InterceptorC.class)
    public void show() {
        //虽然Clear注解中指定清除InterceptorC,但由于Clear只针对本层之上的拦截器
        //因此InterceptorC无法被清除
    }
}

    

猜你喜欢

转载自blog.csdn.net/qq_33323054/article/details/82218684
今日推荐