【问题标题】:AOP for Spring Controllers用于 Spring 控制器的 AOP
【发布时间】:2011-05-03 06:02:22
【问题描述】:

Spring 的 AOP 功能非常棒,它可以很容易地为控制器添加很酷且有用的注解。例如,我编写了一个 @Authenticated 注释,它允许经过身份验证的用户通过控制器方法或重定向到登录页面。有趣的东西。

然而,Spring 的控制器可以返回各种不同的类型。它们可以返回字符串、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 */
       }
   }

}

【问题讨论】:

    标签: spring spring-mvc spring-aop


    【解决方案1】:

    哈,想通了!

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

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

    【讨论】:

    • 只是想说这种方法很好,但您最终会在每个端点添加@Authenticated 注释。如果,您将所有公共方法改为进行身份验证,该怎么办。
    【解决方案2】:

    是的,这表明你是对的。

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

    但是Spring Security已经内置了Authorization,你不需要自己实现。

    【讨论】:

      猜你喜欢
      • 2017-03-21
      • 2015-06-04
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多