弹簧控制器的AOP

时间:2011-05-03 06:02:23

标签: spring spring-mvc spring-aop

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 :(得分:0)

是的,它接缝你是对的。

  • 您需要更改方法,以便所有方法都返回ModelAndView。
  • 或者您需要两个Aspects,一个用于返回类型ModelAndView,另一个用于String - 然后所有控制器方法必须匹配

但授权已经在Spring Security中构建,您无需自己实现。

答案 1 :(得分:0)

哈,想通了!

我决定使用传递给aspect方法的ProceedingJoinPoint来计算原始方法的返回类型。然后我根据传递的返回类型为方法方法制作了一组可能的“失败”结果。例如,如果方法最初返回一个String,则返回“failure_page”,如果该方法返回一个ModelAndView,则返回一个新的ModelAndView(“failure_page”)。

效果很好!不幸的是,如果它返回一个字符串并且没有将ModelMap作为参数,我可能没有机会设置一个模型对象,但我可以处理错误页面就好了。