【问题标题】:Accessing HttpServletRequest from AOP advice in Spring 2.5 with annotations在 Spring 2.5 中使用注释从 AOP 建议访问 HttpServletRequest
【发布时间】:2010-11-01 22:32:29
【问题描述】:

我已经尝试在 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?

【问题讨论】:

标签: java spring annotations aop


【解决方案1】:

总结的两个解决方案,但不是你的整个问题(完全)

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

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

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

@Autowired(required=true)
private HttpServletRequest request;

【讨论】:

  • 在使用 @Configurable 时,解决方案 2 适用于 Spring 未实例化的对象(需要 AspectJ)
【解决方案2】:

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

【讨论】:

  • 是的,我知道这一点。我的问题是每个方法应该可以稍微配置一下。注释将是理想的选择,因为它们允许以一种非常简单的方式来处理该额外参数。
  • 是的,我可以看到这将是限制性的。另一种选择可能是编写自己的 HandlerAdapter 实现,可能是 AnnotationMethodHandlerAdapter 的子类。我自己从来没有这样做过,但它可以让你灵活地做你需要的事情。
猜你喜欢
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多