发现jfinal中的ClearInterceptor注解清除时只有ALL和UPPER两个选项,不能清除指定的某个Interceptor,所以自己实现了一个,以下是代码:
1.自定义一个注解类,SkipInterceptor.java
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface SkipInterceptor {
public Class extends Interceptor>[] value();
}
2.自定义一个Interceptor的父类,BaseInterceptor.java
public abstract class BaseInterceptor implements Interceptor {
/**
* 是否跳过该拦截器
* @param subClass
* @return
*/
public boolean isSkip(Class extends BaseInterceptor> subClass,Method methodClass){
boolean flag=false;
SkipInterceptor classInterceptorAnn=methodClass.getClass().getAnnotation(SkipInterceptor.class);
SkipInterceptor methodInterceptorAnn=methodClass.getAnnotation(SkipInterceptor.class);
if(classInterceptorAnn!=null){//如果类上有注解
Class extends Interceptor>[] values=classInterceptorAnn.value();
if(ArrayUtils.contains(values,subClass)){
flag=true;
}
}else if(methodInterceptorAnn!=null){
Class extends Interceptor>[] values=methodInterceptorAnn.value();
if(ArrayUtils.contains(values,subClass)){
flag=true;
}
}
return flag;
}
}
3.所有的拦截器类继承BaseInterceptor类,然后在intercept方法中调用父类的isSkip方法。
public class TokenInterceptor extends BaseInterceptor {
public Logger log=Logger.getLogger(getClass());
@Override
public void intercept(ActionInvocation ai) {
if(isSkip(getClass(),ai.getMethod())){
ai.invoke();
}else{
checkToken(ai);
}
}
}
4.在Controller中调用时可以把@SkipInterceptor添加到类上,也可以添加到方法上。如下:
@SkipInterceptor(TokenInterceptor.class)
public class UserInfoControl extends BaseControl{
@SkipInterceptor(TokenInterceptor.class)
public void index(){
}