我对Spring MVC不是很有经验,我感觉这是微不足道的(好吧,在ASP.NET中它几乎就是这样),但我无法找到任何解决方案,所以我不得不问。
假设我有不同的控制器,所有控制器都会检查每种方法的内容......
@Controller
public class FirstController {
@RequestMapping("/foo")
public String foo(HttpSession s) {
if(!s.getAttribute("something").equals("some stuff"))
return "redirect:home";
return "foo";
}
@RequestMapping("/bar")
public String bar(HttpSession s) {
if(!s.getAttribute("something").equals("some stuff"))
return "redirect:home";
return "bar";
}
}
@Controller
public class AnotherController {
@RequestMapping("/john")
public String john(HttpSession s) {
if(Integer.parseInt(s.getAttribute("somethingElse")) == 42)
return "redirect:home";
return "john";
}
@RequestMapping("/doe")
public String doe(HttpSession s) {
if(Integer.parseInt(s.getAttribute("somethingElse")) == 42)
return "redirect:home";
return "doe";
}
}
有没有办法让每个控制器做到这一点"它的东西"在实际调用控制器"应该"之前做。所以控制器可能就像:
public String foo() { return "foo"; }
虽然我知道在后台调用if语句之前会触发实际方法。
任何简短的示例或文档链接(或几乎任何适合此请求的内容)都非常受欢迎!
答案 0 :(得分:2)
我建议查看@ControllerAdvice:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-controller-advice
的用法您可以将@ControllerAdvice结合起来,在执行之前拦截所有Controller方法的执行,以及您创建的自己的基本Controller类,它具有公共字符串evaluate()等公共方法,然后您可以在每个子方法中实现-classed controller并在@ControllerAdvice中调用。