在布置项目时,我们都希望工程中的信息只向一部分人可见,对于没有经过许可的访客,我们更希望能有选择地拒绝对方的访问,在这里就需要使用到拦截器Interceptor。拦截器的作用是对action的请求进行拦截处理,在向指定访客展示网站信息的同时,将未经许可的请求拦截下来。
在JFinal中拦截器的拦截粒度分为如下几个等级,并且拦截器各级别的执行次序也以此排序:Global、Inject、Class、Method。如果在同级别中有多个拦截器,则在同级别中配置在前面的先执行。
在拦截器的配置中,需要使用到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是用于清除拦截器对方法的拦截。在上面我们有提到拦截器从上到下分为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无法被清除
}
}