在春季控制器方法之前进行会话检查

时间:2016-02-12 14:31:05

标签: java spring spring-mvc

我对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语句之前会触发实际方法。

任何简短的示例或文档链接(或几乎任何适合此请求的内容)都非常受欢迎!

1 个答案:

答案 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中调用。