2009-09-03 4 views
0

Я только начинаю изучать AspectJ, и у меня есть случай использования, скажем, Вход пользователя. Если данные сеанса пользователя (файлы cookie) не соответствуют сохраненным данным на сервере, я хочу изменить вызванную функцию. Скажем, у меня есть две операции:Посоветуйте в 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

В нашем проекте мы использовали фильтр сервлетов для точной идентификации. Есть ли причина, по которой вы хотите использовать АОП?

Но если вам все еще нужно использовать 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().

+0

... эта возможность подбирать дополнительные контекстные данные в качестве параметров (в виде типов, в которых выполняется проверка компилятора) является основной силой решения на основе aop. Вы не могли бы сделать это с помощью фильтра сервлетов или динамического прокси – Ichthyo