我刚刚开始学习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()工作呢?
答案 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。