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



转载于:https://my.oschina.net/944431343/blog/465666

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值