论坛首页 Java企业应用论坛

struts+spring(aop) 权限管理一问

浏览 13089 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-06-22  
众所周知,aop编程的一个好处是通过在xml文件中配置拦截器来实现权限,日志,事务处理等功能,我想在我的应用程序中,通过拦截器来实现权限控制,当用户没有权限时,服务器给用户一个错误提示页面,可是必须获得一个request(HttpRequest)对象才能实现改效果(就好像在ServletFilter实现权限控制一样),
那么如何在我的拦截器类中获取容器的request(HttpRequest)对象呢??
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
import org.apache.log4j.*;


public class AuthorizeAdvice implements MethodBeforeAdvice {
    Logger logger = Logger.getLogger(AuthorizeAdvice.class);
    public AuthorizeAdvice() {
        PropertyConfigurator.configure("log4j_2.properties");
    }

    public void before(Method m, Object[] args, Object target) throws Throwable {
        if(!User.Permission(){
            在这里获取容器的request对象??
               request.^^^^^

           }
     
    }

}
   发表时间:2005-06-22  
用threadlocal装一个context对象,本来权限控制就是要依赖于上下文的,可以参考acegi的相关实现,而且你这个思路acegi实现的不错,不必再重复造轮子了
0 请登录后投票
   发表时间:2005-07-01  
楼主看来还是没有明白AOP的含义,很明显的嘛,public void before(Method m, Object[] args, Object target)
Method就是你要拦截的方法名称,而args就是方法的参数。
如果你的方法是aaa(HttpServletRequest request,HttpServletResponse response)
那在你的before里只要
HttpServletRequest request=(HttpServletRequest )args[0]就ok了。
0 请登录后投票
   发表时间:2005-07-01  
对了,关于这个利用AOP拦截的东西,我以前的帖子也提到过的,建议你还是使用Filter比较好些,用来做粗粒度控制,然后用AOP对具体的来做权限的细分。
0 请登录后投票
   发表时间:2005-07-25  
giginet 写道
楼主看来还是没有明白AOP的含义,很明显的嘛,public void before(Method m, Object[] args, Object target)
Method就是你要拦截的方法名称,而args就是方法的参数。
如果你的方法是aaa(HttpServletRequest request,HttpServletResponse response)
那在你的before里只要
HttpServletRequest request=(HttpServletRequest )args[0]就ok了。

你这样弄肯定不好,一般在controller里面都是调用的service层的接口,你这么做不就是把service传到service layer了?
最好的办法还是参考acegi里面的方法,其实这是需要的知识一个ContextHolder和一个RequestContext。用ThreadLocal实现。具体参考acegi的源码,很简单的
2 请登录后投票
   发表时间:2005-07-27  
阿木欢 写道
giginet 写道
楼主看来还是没有明白AOP的含义,很明显的嘛,public void before(Method m, Object[] args, Object target)
Method就是你要拦截的方法名称,而args就是方法的参数。
如果你的方法是aaa(HttpServletRequest request,HttpServletResponse response)
那在你的before里只要
HttpServletRequest request=(HttpServletRequest )args[0]就ok了。

你这样弄肯定不好,一般在controller里面都是调用的service层的接口,你这么做不就是把service传到service layer了?
最好的办法还是参考acegi里面的方法,其实这是需要的知识一个ContextHolder和一个RequestContext。用ThreadLocal实现。具体参考acegi的源码,很简单的

我说的这个和service层有什么关系呢?这个本来就是对structs action的拦截啊。而且AOP本来就有这个坏处,有很多都是和具体应用相关系的,很容易和系统“绑死”。

提外话:谁说service传到service layer里就不可以呢?
0 请登录后投票
   发表时间:2005-07-27  
giginet 写道
阿木欢 写道
giginet 写道
楼主看来还是没有明白AOP的含义,很明显的嘛,public void before(Method m, Object[] args, Object target)
Method就是你要拦截的方法名称,而args就是方法的参数。
如果你的方法是aaa(HttpServletRequest request,HttpServletResponse response)
那在你的before里只要
HttpServletRequest request=(HttpServletRequest )args[0]就ok了。

你这样弄肯定不好,一般在controller里面都是调用的service层的接口,你这么做不就是把service传到service layer了?
最好的办法还是参考acegi里面的方法,其实这是需要的知识一个ContextHolder和一个RequestContext。用ThreadLocal实现。具体参考acegi的源码,很简单的

我说的这个和service层有什么关系呢?这个本来就是对structs action的拦截啊。而且AOP本来就有这个坏处,有很多都是和具体应用相关系的,很容易和系统“绑死”。

提外话:谁说service传到service layer里就不可以呢?

sorry,笔误笔误:(
我的意思是说,你不应该把HttpServletRequest 做为参数传到service layer。这么做的坏处,你也应该知道吧。
这个不是AOP的坏处,有办法解决AOP的上下文问题,上面的帖子里面已经说到了。
0 请登录后投票
   发表时间:2005-07-27  
仔细看了一下,楼主是在拦截action啊,呵呵,不好意思,我还以为是在action里面拦截service呢。
0 请登录后投票
   发表时间:2005-07-27  
为什么不改用webwork?简单的多啊!
0 请登录后投票
   发表时间:2005-07-28  
呵呵,我说的AOP容易绑死是指:如果你用一个框架的AOP,譬如Spring,那么这段代码就和spring绑死了,不象ioc来的那么痛快,而且本身这个也不符合OO规则,但是这个功能的确非常实用。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics