最新在学习拦截器原理,网上查询资料说拦截器都是基于动态代理实现。
在网上学习动态代理后,自己写了个小例子,简单权限过滤,基于JDK动态代理实现。
贴出来搭建一起学习交流。
目标抽象接口:
public interface DbOperator {
public void add();
public void query();
public void update();
public void delete();
}
目标对象:
public class User implements DbOperator {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name){
this.name = name;
}
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println(name+"添加");
}
@Override
public void query() {
System.out.println(name+"查询");
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println(name+"更新");
}
@Override
public void delete() {
// TODO Auto-generated method stub
System.out.println(name+"删除");
}
}
目标处理Handle:
public class UserHandle implements InvocationHandler {
//目标对象
Object targetObj;
//拦截器类(权限检查)
Aspect aspect;
public UserHandle(Object targetObj,Aspect aspect){
this.targetObj = targetObj;
this.aspect = aspect;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object value = null;
boolean flag = aspect.before(((User)targetObj).getName() , method.getName());
//根据用户权限检查结果,判断用户是否有权限调用方法
if(flag){
value = method.invoke(targetObj, args);
}
aspect.after();
return value;
}
}
拦截器接口:
public interface Aspect {
public boolean before(String userName,String methodName);
public void after();
}
拦截器实现:
public class AspectImplOne implements Aspect {
@Override
public boolean before(String userName , String methodName) {
// TODO Auto-generated method stub
boolean flag = true;
System.out.println("********权限检查 before");
if(methodName.equals("query") || userName.equals("lisi") && (methodName.equals("update") || methodName.equals("add") || methodName.equals("delete"))){
}else{
System.out.println("警告:"+userName+"没有权限 "+methodName);
flag = false;
}
return flag;
}
@Override
public void after() {
// TODO Auto-generated method stub
System.out.println("********权限检查 after");
}
}
代理工厂:
public class DynamicProxyFactory {
/**
* @param dbOperator 被代理对象(目标对象)
* @param userHandle 用户处理器
* @return 代理对象
*/
public static Object getProxy(DbOperator dbOperator,UserHandle userHandle){
return Proxy.newProxyInstance(dbOperator.getClass().getClassLoader(), dbOperator.getClass().getInterfaces(), userHandle);
}
}
动态代理测试:
public class DynamicProxy {
/**
* @param args
*/
public static void main(String[] args) {
//创建目标对象
DbOperator zhangsan = new User("zhangsan");
DbOperator lisi = new User("lisi");
//创建权限检查对象
Aspect aspect = new AspectImplOne();
//生成代理对象
DbOperator proxy1 = (DbOperator)DynamicProxyFactory.getProxy(zhangsan, new UserHandle(zhangsan,aspect));
DbOperator proxy2 = (DbOperator)DynamicProxyFactory.getProxy(lisi, new UserHandle(lisi,aspect));
//通过代理调用目标方法
proxy1.query();
proxy1.add();
proxy1.update();
proxy1.delete();
proxy2.query();
proxy2.add();
proxy2.update();
proxy2.delete();
}
}