建议AspectJ改变控制流程

时间:2009-09-03 02:11:03

标签: java aop aspectj

我刚刚开始学习AspectJ,我有用例说,用户登录。如果用户的会话数据(cookie)与服务器上存储的数据不匹配,我想更改调用的函数。说我有两个操作:

class HttpServlet { 
   public function() { 
   } 
   public function2() { 
   }
   public doLogin() { 
   }
} 

我建议如:

public aspect UserLoggedIn {

    pointcut GreetingServer(): within(HttpServlet);
    pointcut requireAuth(): 
       GreetingServer() && execution(* function*(..));
    before(): requireAuth() {
        if ( notLoggedIn ) { 
          redirectToDoLoginAndAbortCalledFunction();
        }
    }
}

那么如何让redirectToDoLoginAndAbortCalledFunction()工作呢?

2 个答案:

答案 0 :(得分:3)

你会想要使用周围的建议,而不是之前的建议,如下所示。这是一个假设两个方法都返回boolean的例子:

 boolean around(): requireAuth() {
    if ( notLoggedIn ) {           
        return redirectToDoLoginAndAbortCalledFunction();        
    } else {
        return proceed();
    }    
 }

您可能还需要将参数传递给您的建议,您可以使用this(),target()和args()切入点在切入点中捕获正确的值。

答案 1 :(得分:2)

在我们的项目中,我们使用servlet Filter进行完全相同的身份验证。你有什么理由想要使用AOP吗?

但是如果您仍然需要使用AspectJ,则应使用around方面以便能够干扰方法调用。我们使用类似的技术来缓存方法返回值。

您可以在本文中查看示例http://www.theserverside.com/tt/blogs/showblog.tss?id=AspectJCaching