2009-09-03 4 views
0

방금 ​​AspectJ를 배우기 시작했고, 사용자 로그인에 유스 케이스가있다. 사용자의 세션 데이터 (쿠키)가 서버의 저장된 데이터와 일치하지 않으면 호출 된 함수를 변경하려고합니다.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

우리 프로젝트에서는 동일한 인증 목적으로 Servlet Filter를 사용했습니다. 어떤 이유로 AOP를 사용하고 싶습니까?

그러나이 경우에도 AspectJ를 사용해야하는 경우 간섭 호출을 수행하려면 around 속성을 사용해야합니다. 메소드 반환 값의 캐싱에 비슷한 기술을 사용했습니다.

이 기사에서는 http://www.theserverside.com/tt/blogs/showblog.tss?id=AspectJCaching의 예를 볼 수 있습니다.

+0

특별한 이유가 없습니다. 저는 AspectJ를 배우려고 노력하고 있고 다른 방법으로 평소에 할 일을하려고 노력하고 있습니다. –

3

아래 조언과 같이 주위에 조언을 사용하는 것이 좋습니다.

당신은 또한 당신이이()를 사용하여 포인트 컷에 적절한 값을 캡처하여 할 수있는 귀하의 조언에 매개 변수를 전달해야 할 수도 있습니다
boolean around(): requireAuth() { 
    if (notLoggedIn) {   
     return redirectToDoLoginAndAbortCalledFunction();   
    } else { 
     return proceed(); 
    }  
} 

, 대상 : 다음 두 가지 방법이 부울을 반환한다고 가정 예입니다() 및 args() pointcut을 사용합니다.

+0

...이 Apt 기반 솔루션의 주요 강점은 추가 컨텍스트 데이터를 매개 변수로 선택하는 것입니다 (형식 유지 방법, 컴파일러 검사). 서블릿 필터 또는 동적 프록시를 사용하여이를 수행 할 수 없습니다. – Ichthyo