权限控制在很多系统中都会用到,其实实现权限控制方法有很多,这里给大家介绍一下通过代理模式实现权限控制。Spring中的AOP、Apache的shiro开源项目,其实都是基于此的。
1、实体类Person.java
public class Person {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2、业务逻辑层接口及实现类
这里的业务逻辑层接口就是代理模式中的抽象对象角色,它的实现类就是真实对象。
import java.util.List;
import java.util.Map;
public interface IPersonService {
Integer savePerson(Person person);
void updatePerson(Person person);
List<Person> findPersonList(Map<String,Object> param);
}
import java.util.List;
import java.util.Map;
public class PersonServiceImpl implements IPersonService{
@Override
public Integer savePerson(Person person) {
return null;
}
@Override
public void updatePerson(Person person) {
}
@Override
public List<Person> findPersonList(Map<String, Object> param) {
return null;
}
}
3、创建代理类的工厂
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ServiceProxyFactory implements InvocationHandler {
private Object service = null;//真实对象
public ServiceProxyFactory(){
}
public Object createServiceProxy(Object obj){
this.service = obj;
return Proxy.newProxyInstance(this.service.getClass().getClassLoader(),
this.service.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
PersonServiceImpl personService = (PersonServiceImpl)service;
if(......){//判断当前登录的用户有没有权限
return method.invoke(service, args);
}
return null;
}
}
4、使用代理类
public class TestProxy{
public static void main(String[] args){
IPersonService service = new PersonServiceImpl();//真实对象
ServiceProxyFactory proxyFactory = new ServiceProxyFactory();
IPersonService proxyService = proxyFactory.createServiceProxy(service);//代理对象
proxyService.savePerson();//使用代理对象保存Person,当代理对象执行savePerson()方法时,会调用proxyFactory的invoke()方法,因为在创建代理对象时,Proxy.newProxyInstance()方法的第三个参数中传入了一个ServiceProxyFactory的实例。在invoke方法内部就可以进行权限控制,查看当前用户有没有权限进行savePerson()操作。
}
}