АОП для пружинных контроллеров - PullRequest
4 голосов
/ 03 мая 2011

Функциональность Spring AOP довольно велика, и она позволяет легко добавлять интересные и полезные аннотации на контроллеры.Например, я написал аннотацию @Authenticated, которая либо позволяет аутентифицированным пользователям проходить через метод контроллера, либо перенаправляет на страницу входа.Забавные вещи.

Однако контроллеры Spring могут возвращать всевозможные типы.Они могут возвращать Strings, ModelAndView объекты или даже void.В моей базе кода есть методы, которые используют все три типа.Однако я хотел бы изменить мою аннотацию @Authenticated для отображения и возврата определенной страницы, что я и надеялся сделать, возвращая объект ModelAndView.Это единственный способ сделать это, требуя, чтобы все мои методы контроллера возвращали ModelAndView?

Пример контроллера, который я хотел бы получить:

@Controller
public class MyController() {
   @Authenticated
   @RequestMapping("/myscore")
   public String myScorePage(ModelMap model) {
      return "myScorePage";
   }

   @Authenticated
   @RequestMapping("/anotherPage")
   public ModelAndView something() {
      return new ModelAndView("anotherPage",someModelStuff());
   }
}

@Aspect
public class NotVeryUsefulAspect {
   @Around("@annotation(Authenticate)")
   public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
       if( isAuthenticated() ) {
           return pjp.proceed();
       } else {
           return /* Oh no what goes here, I want to render a FAILURE page without redirecting */
       }
   }

}

Ответы [ 2 ]

0 голосов
/ 04 мая 2011

Ха, разобрался!

Я решил использовать ProceedingJoinPoint, переданный в метод аспекта, чтобы выяснить тип возврата исходного метода.Затем я сделал набор возможных результатов «сбой» для метода аспекта, основанный на том, какой тип возврата передается.Например, если метод первоначально возвратил строку, я возвращаю «fault_page», а если метод возвратил ModelAndView, я возвращаю новый ModelAndView («fault_page»).

Работает довольно хорошо!К сожалению, у меня может не быть возможности установить объект модели, если он возвращает строку и не принимает ModelMap в качестве параметра, но я могу справиться с этим для страницы с ошибкой.

0 голосов
/ 03 мая 2011

Да, это говорит о том, что вы правы.

  • Вам нужно изменить свои методы, чтобы все возвращали ModelAndView.
  • Или вам нужны два аспекта, один для возвращаемого типа ModelAndView и один для String - и тогда все ваши методы контроллера должны совпадать

Но авторизация уже встроена в Spring Security , и вам не нужно реализовывать ее самостоятельно.

...