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 */
}
}
}
答案 0 :(得分:0)
是的,它接缝你是对的。
但授权已经在Spring Security中构建,您无需自己实现。
答案 1 :(得分:0)
我决定使用传递给aspect方法的ProceedingJoinPoint来计算原始方法的返回类型。然后我根据传递的返回类型为方法方法制作了一组可能的“失败”结果。例如,如果方法最初返回一个String,则返回“failure_page”,如果该方法返回一个ModelAndView,则返回一个新的ModelAndView(“failure_page”)。
效果很好!不幸的是,如果它返回一个字符串并且没有将ModelMap作为参数,我可能没有机会设置一个模型对象,但我可以处理错误页面就好了。