使用注释从Spring 2.5中的AOP建议访问HttpServletRequest

时间:2009-06-10 19:35:26

标签: java spring annotations aop

我试图在Spring论坛和搜索StackOverflow上找到这个问题的答案。我发现很多页面都描述了可怕的架构,并且要求和我做同样的事情,但我的用途是不同的,所以请耐心等待: - )

我有一个Spring 2.5项目,使用基于注释的表单控制器基本上是这样的:

@RequestMapping("/edit/someObject")
public String handleSubmit(HttpServletRequest request, HttpServletResponse response, SomeObject someObject, BindingResult result) {

    // Some check here

    if(result.hasErrors()) {
        return "form";
    } else {
        SomeObjectService.update(someObject);
        return "redirect:/view/someObject";
    }
}

在此我检查HttpServletRequest中的一些http属性,如果此属性具有特定值,则使用HttpServletResponse发送重定向。完成此检查的是此应用程序中的很多(但不是全部)表单控制器。我想要做的是创建一个由一些AOP建议处理的@CheckedSubmit注释来执行此检查,然后从控制器中删除HttpServletRequest和HttpServletResponse参数。

我的问题是我不知道如何从这个AOP建议中访问当前的HttpServletRequest和HttpServletResponse而不将这两个作为(未使用的)参数用于带注释的方法,这是我首先想要避免的。 / p>

总结:如何在@RequestMapping带注释的方法上从AOP建议访问HttpServletRequest / Response?

2 个答案:

答案 0 :(得分:13)

摘要的两个解决方案,但不是完整的问题

解决方案1:内部建议(> =需要Spring 2.0)

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
        .getRequestAttributes()).getRequest();

解决方案2:内部方面类(可能需要在singelton bean中使用Spring 3.0!)

@Autowired(required=true)
private HttpServletRequest request;

答案 1 :(得分:3)

我想你可能已经知道了,但是“官方”是在Spring中做到这一点MVS是使用HandlerInterceptors。它们不是注释驱动的,但它们会插入到HTTP控制流中,并获得对请求和响应的完全访问权。