2009-09-03 35 views
0

我剛剛開始學習AspectJ,並且我有用例說用戶登錄。如果用戶的會話數據(cookies)與服務器上存儲的數據不匹配,我想更改調用的函數。說我有兩個操作:在AspectJ中建議改變控制流程

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

在我們的項目中,我們使用了servlet Filter來完全實現相同的認證目的。有沒有什麼理由要爲此使用AOP?

但是如果您仍然需要使用AspectJ,您應該使用around方面以便能夠干擾方法調用。我們使用類似的技術來緩存方法返回值。

你可以看這篇文章,例如http://www.theserverside.com/tt/blogs/showblog.tss?id=AspectJCaching

+0

沒有特別的理由。我正在嘗試學習AspectJ,所以試圖通過其他方式來做我通常會做的事情。 – 2009-09-03 20:10:24

3

你會想使用周圍的建議,而不是之前的建議,像下面的東西。這裏是假設這兩種方法返回布爾一個例子:

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

您可能還需要在參數傳遞給你的建議,你可以使用這個()的切入點捕捉正確的價值觀去做,目標()和args()切入點。

+0

...這種以附加上下文數據爲參數的可能性(以類型安全的方式,這種編譯器檢查)是基於aop的解決方案的主要優勢。你不能通過servlet過濾器或動態代理來實現 – Ichthyo 2010-09-12 00:53:22