jfinal清除某一个或多个Interceptor

    发现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(){
}



你可能感兴趣的:(jFinal)