2009-09-03 14 views
0

私はAspectJを学び始めています。ユーザログインと言ってユースケースがあります。ユーザーのセッションデータ(Cookie)がサーバー上の格納されたデータと一致しない場合は、呼び出された関数を変更する必要があります。AspectJの制御フローを変更するためのアドバイス

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

と私のようなアドバイスがあります:だから私は作るのですかredirectToDoLoginAndAbortCalledFunction()仕事

public aspect UserLoggedIn { 

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

私は2つの操作を持っていると言いますか?

答えて

2

私たちは、正確に同じ認証目的のためにServlet Filterを使用しました。 AOPを使用したい理由はありますか?

しかし、それでもAspectJを使用する必要がある場合は、メソッド呼び出しを干渉させるために、aroundアスペクトを使用する必要があります。メソッド戻り値のキャッシュには、同様の技術を使用しました。

この記事では、http://www.theserverside.com/tt/blogs/showblog.tss?id=AspectJCachingの例を見ることができます。

+0

特に理由はありません。私はAspectJを勉強しようとしているので、通常は他の方法でやることをしようとしています。 –

3

あなたはbefore adviceの代わりにaround adviceを使用したいと思うでしょう。

また、あなたはこれを()を使用して、ポイントカットに適切な値をキャプチャすることによって行うことができますあなたのアドバイスにパラメータを渡す必要があるかもしれません
boolean around(): requireAuth() { 
    if (notLoggedIn) {   
     return redirectToDoLoginAndAbortCalledFunction();   
    } else { 
     return proceed(); 
    }  
} 

、対象:ここでは、両方の方法は、ブール値を返すことを想定例があります()、args()のポイントカットを使用します。

+0

...このように、コンテキスト・データをパラメータとして(タイプセーフな方法でコンパイラ・チェックで)ピックアップすることが、aopベースのソリューションの主な強みです。あなたはサーブレットフィルタや動的プロキシではできませんでした – Ichthyo

関連する問題