Spring控制器的AOP

5

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 */
       }
   }

}
2个回答

2

哈,搞定了!

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

效果相当不错!不幸的是,如果它返回一个字符串并且没有以ModelMap作为参数接收,我可能没有机会设置模型对象,但对于错误页面,这样做没什么问题。


只是想说这种方法没问题,但你最终会在每个端点添加@Authenticated注释。如果你把所有公共方法都设置为需要身份验证,会怎样呢? - newday

0

是的,看起来你是对的。

  • 你需要改变你的方法,使得它们都返回一个ModelAndView。
  • 或者你需要两个切面,一个用于返回类型为ModelAndView,另一个用于String - 然后所有的控制器方法都必须匹配。

但是授权已经在Spring Security中内置,您不需要自己实现它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接