将对象从Spring HandlerInterceptor传递给Servlet Filter

时间:2014-05-28 16:24:05

标签: java spring spring-mvc servlet-filters

有一个webapp,每个请求都会消耗各种外部资源。 webapp使用请求scooped bean跟踪那些消耗的资源。然后,HandlerInterceptor的afterCompletion方法调用TaskExecutor将此信息存储在DB中。一切都很好,花花公子,但需要添加带消耗作为另一种资源。计算传出响应大小是servlet过滤器的典型任务(以及响应包装器和自定义流实现)。所以这已经完成并且也在发挥作用。

问题在于我想将两件事情聚合在一起。显然,我无法通过"发送的字节"到Spring HandlerInterceptor,因为过滤器的doFilter()还没有完成,拦截器运行时发送的字节数也是不可知的。因此,filter必须是聚合所有资源使用情况的地方,并启​​动异步任务以将其存储在DB中。问题是:如何将数据从HandlerInterceptor传递到Filter。我尝试过简单的request.setAttribute(),但令人惊讶的是它没有用。

作为旁注:我知道请求scooped bean生命周期,并且在处理程序中我创建了一个填充了来自scooped bean的数据的简单POJO。

1 个答案:

答案 0 :(得分:1)

问题证明是非常值得的。作为somehwat正常请求处理的一部分,该应用程序正在进行大量的前进/调度。事实证明我的过滤器被调用(到目前为止,那么好),然后链中的另一个过滤器正在进行前向/分派,然后进行实际的请求处理。默认筛选器设置仅捕获普通请求,您还需要其他配置(web.xml)来过滤转发/分派。我刚刚那样做了,解决了这个问题。