Java 在AspectJ中建议更改控制流
我刚刚开始学习AspectJ,我有一个用户登录的用例。如果用户的会话数据(cookies)与服务器上存储的数据不匹配,我想更改调用的函数。假设我有两个操作:Java 在AspectJ中建议更改控制流,java,aop,aspectj,Java,Aop,Aspectj,我刚刚开始学习AspectJ,我有一个用户登录的用例。如果用户的会话数据(cookies)与服务器上存储的数据不匹配,我想更改调用的函数。假设我有两个操作: class HttpServlet { public function() { } public function2() { } public doLogin() { } } 我的建议包括: public aspect UserLoggedIn { pointcut Greetin
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过滤器或动态代理无法做到这一点