Java 在AspectJ中建议更改控制流

Java 在AspectJ中建议更改控制流,java,aop,aspectj,Java,Aop,Aspectj,我刚刚开始学习AspectJ,我有一个用户登录的用例。如果用户的会话数据(cookies)与服务器上存储的数据不匹配,我想更改调用的函数。假设我有两个操作: class HttpServlet { public function() { } public function2() { } public doLogin() { } } 我的建议包括: public aspect UserLoggedIn { pointcut Greetin

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

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();
        }
    }
}

那么,如何使RedirectToLoginandAbortCalledFunction()工作

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

但是,如果您仍然需要使用AspectJ,您应该在aspect周围使用
,以便能够插入方法调用。我们使用类似的技术来缓存方法返回值


您可以在本文中查看一个示例。

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

但是,如果您仍然需要使用AspectJ,您应该在aspect周围使用
,以便能够插入方法调用。我们使用类似的技术来缓存方法返回值


你可以看看这篇文章作为一个例子。

你会想使用around-advice而不是before-advice,如下所示。下面是一个假设两个方法都返回布尔值的示例:

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

您可能还需要将参数传递给通知,这可以通过使用this()、target()和args()切入点捕获切入点中的正确值来实现。

您将希望使用around通知而不是before通知,如下所示。下面是一个假设两个方法都返回布尔值的示例:

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

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

没有特别的原因。我正在尝试学习AspectJ,所以我尝试用其他方式做我通常会做的事情。没有特别的原因。我正在尝试学习AspectJ,因此尝试以其他方式做我通常会做的事情……这种可能性是基于aop的解决方案的主要优势,它可以选择额外的上下文数据作为参数(以类型安全的方式,即编译器检查)。使用servlet过滤器或动态代理无法做到这一点……这种选择额外上下文数据作为参数的可能性(以类型安全的方式,即编译器检查)是基于aop的解决方案的主要优势。使用servlet过滤器或动态代理无法做到这一点