`
theabab
  • 浏览: 41327 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

一个想法 method控制权限(未实践)

阅读更多
通过配置spring  aop拦截器和advice可以实现对action下面的所有方面进行拦截,假如我们要拦截某个具体的方法,却在配置切入点的时候不成功(我没佩成功!),于是换了2个想法:
1:每次调用的时候携带action方法参数:如:login.action?method=xxxxx;用
    String  method=request.getParameter("method");获取method参数
2:例外MVC实现的时候不会全部带上method的参数,例如:login.action,这样不带参数的话,Action里面肯定有一个方法叫login的,会默认寻找。(我的理解!),既然这样,我们可以把login 截取下来,也是action要调用的方法!(想了下,这里可能不会唯一,因为可以带参数!)
而且action里面的方法名都是唯一的。这样我们通过数据库设置这些方法的使用权限,然后实现环绕通知来控制访问权限。

希望高手指点指点。不知可行不可行!
如有实践权限控制的,恳请发一份例子yankang.nd@163.com! 谢谢!


笔记:
生成代理类的代码:
     Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);

package net.kingbit.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

/**
*
* @author yankang <yankang.nd@163.com>
*/
public class DynamicProxy implements InvocationHandler {

    private Object  proxyObj;
    public DynamicProxy(Object object)
    {
        this.proxyObj=object;
    }

    public static Object  factory(Object object)
    {
        Class cls=object.getClass();
        System.out.println("cls name:"+cls.getName());
        return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new DynamicProxy(object));
    }

   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       System.out.println("DynamicProxy invoke!");
       System.out.println("method name:"+method.getName());
       System.out.println("proxy class:"+proxy.getClass());
       if(args!=null)
       {
           for(int i=0;i<args.length;i++)
           {
               System.out.println("args["+i+"] :"+args[i]);
           }
       }
       Object o=method.invoke(proxyObj, args);//java反射调用代理目标类的方法
       return o;

    }

public static void main(String[] args)
{
   List<String> v = null;
//    //DynamicProxy dp=new DynamicProxy(new Vector());
v=(List<String>) DynamicProxy.factory(new ArrayList());
//v.isEmpty();
v.add("bbbb");
//    Computer cb=null;
//    cb=    (Computer) DynamicProxy.factory(new ComputerBuy());
//    cb.buy();
}
}
分享到:
评论
3 楼 theabab 2009-03-27  
metadmin 写道

我想到了2个问题,一起探讨一下:1,方法拦截技术。我觉得这个spring应该可以做到,aop可以做到方法调用层级的切片。(我对spring和aop都不大了解,所以有些词可能不对,内容也会不准确)spring可以在实例化bean的时候动态注入refBean,当然这些都是spring 容器来完成的,包括实例化。spring也提供了对方法的切片和拦截。spring security里面有很多这样的例子。2,方法拦截是否能完全控制住、或者结合其他办法能控制住权限。举例说明:比如某个dao方法是:dao.update( Customer customer ) 这个方法体内,应该做权限判断吧。权限判断逻辑应该和:调用这个方法的用户有关(一般User在Servlet层可以获取)。那么拦截器怎样获取这个User呢?(这点我没用答案,所以想问问)又或者,把dao方法修改为:dao.update( Customer customer, User user )? 如果这样不大合适吧?3, 权限判断逻辑放在哪里呢?这点你的文章没用提到哦。


首先要说明的一点就是权限判断是和业务逻辑独立起来的。我感觉你的想法还是没有分离出来。最近时间比较忙。我也没研究多少!呵呵,等忙完了在看看。
2 楼 metadmin 2009-03-26  
我想到了2个问题,一起探讨一下:
1,方法拦截技术。
我觉得这个spring应该可以做到,aop可以做到方法调用层级的切片。(我对spring和aop都不大了解,所以有些词可能不对,内容也会不准确)
spring可以在实例化bean的时候动态注入refBean,当然这些都是spring 容器来完成的,包括实例化。
spring也提供了对方法的切片和拦截。spring security里面有很多这样的例子。


2,方法拦截是否能完全控制住、或者结合其他办法能控制住权限。
举例说明:比如某个dao方法是:dao.update( Customer customer ) 这个方法体内,应该做权限判断吧。权限判断逻辑应该和:调用这个方法的用户有关(一般User在Servlet层可以获取)。那么拦截器怎样获取这个User呢?(这点我没用答案,所以想问问)
又或者,把dao方法修改为:dao.update( Customer customer, User user )? 如果这样不大合适吧?


3, 权限判断逻辑放在哪里呢?这点你的文章没用提到哦。
1 楼 metadmin 2009-03-26  
“权限管理”圈子欢迎您!

圈子地址:http://accessmanager.group.iteye.com/

相关推荐

Global site tag (gtag.js) - Google Analytics