Spring MVC 3控制器请求处理程序常见

时间:2011-06-11 23:13:48

标签: java spring-mvc

我有一个控制器,可以处理几个必须检查是否存在相同cookie值的请求。这意味着在每个请求处理程序中,我必须执行相同的检查。

@Controller
public class MyController {

    @RequestMapping("/Path")
    public String Handler1(@CookieValue(required = false, value = "Cookie") String cookie) {

        if (cookie != null) {
            handleNoCookie();
        }
        handleRequest1();
    }

    @RequestMapping("/AnotherPath")
    public String Handler2(@CookieValue(required = false, value = "Cookie") String cookie) {

        if (cookie != null) {
            handleNoCookie();
        }
        handleRequest2();
    }
and so on...
}

是否有办法将重复检查提取到某个方法中,该方法将在实际处理程序执行之前进行检查?

感谢。

3 个答案:

答案 0 :(得分:2)

如果cookie不存在,您可以使用interceptor来“拦截”请求并处理您的逻辑。您可以在通过 preHandle 方法触发控制器之前将其激活。

API:HandlerInterceptor

答案 1 :(得分:1)

如果有大量的Handler方法,你可以查看Spring的AOP来实现所有方法的cookie检查建议。

http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

答案 2 :(得分:0)

其他答案中建议的AOP拦截器是一种配置过度杀伤。

使用@ModelAttribute注释可以实现类似的功能。从Spring 2.5开始提供。使用@ModelAttribute注释的方法必须为视图模型生成参数。在使用@RequestMapping注释的每个方法之前调用这些方法。

如果带注释的方法没有返回任何内容(void-method),它似乎正在工作。在这种情况下,它可以作为一些虚构的“BeforeEveryRequest”注释。它看起来像这样:

@ModelAttribute
public void tagController(HttpServletRequest request) {
    request.setAttribute(VERSION_PARAMETER, version());
}

更新: 有一个小的副作用。它为模型添加了一个dummi值。键是一个字符串“void”,值为null