0

私はAspectJを学び始めたばかりで、たとえばユーザーログインのユースケースがあります。ユーザーのセッション データ (Cookie) がサーバーに保存されているデータと一致しない場合、呼び出される関数を変更したいと考えています。2 つの操作があるとします。

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() を機能させるにはどうすればよいでしょうか。

4

2 に答える 2

3

以下のように、before アドバイスの代わりに around アドバイスを使用することをお勧めします。以下は、両方のメソッドがブール値を返すと仮定した例です。

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

this()、target()、および args() ポイントカットを使用してポイントカットで適切な値を取得することにより、アドバイスにパラメーターを渡す必要がある場合もあります。

于 2009-09-12T22:24:23.607 に答える
2

私たちのプロジェクトでは、まったく同じ認証目的でサーブレット Filter を使用しました。そのために AOP を使用したい理由はありますか?

ただし、そのために AspectJ を使用する必要がある場合は、aroundメソッド呼び出しを妨害できるようにするために、アスペクトを使用する必要があります。メソッドの戻り値のキャッシュにも同様の手法を使用しました。

http://www.theserverside.com/tt/blogs/showblog.tss?id=AspectJCachingの例については、この記事を参照してください。

于 2009-09-03T08:26:29.773 に答える