Посоветуйте в AspectJ изменить поток управления

Я только начинаю изучать AspectJ, и у меня есть прецедент, например, для входа в систему. Если данные сеанса пользователя (файлы cookie) не соответствуют сохраненным данным на сервере, я хочу изменить вызываемую функцию. Скажем, у меня есть две операции:

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()?


person Chris K    schedule 03.09.2009    source источник


Ответы (2)


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

Но если вам все еще нужно использовать AspectJ для этого, вы должны использовать аспект around, чтобы иметь возможность мешать вызову метода. Мы использовали аналогичную технику для кэширования возвращаемых значений метода.

Вы можете посмотреть в этой статье пример http://www.theserverside.com/tt/blogs/showblog.tss?id=AspectJCaching.

person Andrey Adamovich    schedule 03.09.2009
comment
Нет особой причины, почему. Я пытаюсь изучить AspectJ и поэтому пытаюсь делать то, что обычно делаю другими способами. - person Chris K; 04.09.2009

Вы захотите использовать совет вокруг вместо совета перед, как показано ниже. Вот пример, который предполагает, что оба метода возвращают логическое значение:

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

Вам также может понадобиться передать параметры вашему совету, что вы можете сделать, зафиксировав правильные значения в pointcut, используя pointcuts this(), target() и args().

person Andrew Eisenberg    schedule 12.09.2009
comment
... эта возможность получить дополнительные данные контекста в качестве параметров (типизированным способом, который проверяется компилятором) является основной силой решения на основе aop. Вы не могли бы сделать это с фильтром сервлета или динамическим прокси - person Ichthyo; 12.09.2010