9

我试图在 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 而不使用这两个作为(未使用的)参数到带注释的方法,这是我首先试图避免的。

摘要:如何通过 @RequestMapping 注释方法的 AOP 建议访问 HttpServletRequest/Response?

4

2 回答 2

13

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

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

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

解决方案 2:内部方面类(可能需要单例 bean 内部的 Spring 3.0!)

@Autowired(required=true)
private HttpServletRequest request;
于 2009-11-25T10:23:13.450 回答
3

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

于 2009-06-10T20:16:39.210 回答