2009-12-28 504 views
7

我想一个JPA的EntityManager绑定到每个请求(通过ThreadLocal的)当前线程,什么可能通过ServletRequestListener或过滤器来完成。听众看起来更干净,在这种情况下我不需要额外的过滤器。但也许过滤器有我已经错过的优势。Servlet过滤器与ServletRequestListener

我应该使用Servlet过滤器或ServletRequestListener做到这一点?

+1

是关于ServletRequestListener做有螺纹的保证?您确定它是在请求处理的同一线程上同步调用的? – 2009-12-28 16:40:00

+0

在Servlet 3.0规范说:“11.5监听器的实例和线程 [...],直到最后的请求提供服务的Web应用程序容器必须保持对每个监听器实例的引用 属性改变的ServletContext和HttpSession的对象可能CCUR。容器不需要将结果通知同步到属性监听器类,维护状态的监听器类负责数据的完整性,并且应该明确地处理这种情况。 但这不是你的问题的答案......我*认为*它将在同一个线程。 – deamon 2009-12-28 17:03:13

回答

7

你的目的没有太大的区别。但是,听众是“更干净”的,因为读过你的代码的人会立即知道这段代码的目的不可能是拦截请求或改变它,或者做一个过滤器可以做的其他事情。例如,Spring使用ServletRequestListener来允许不使用Spring自己的Web MVC框架的基于Spring的基于Web的应用程序访问特定于Web的功能,例如会话范围的Bean。请参阅this doc

编辑:只是为了更清晰,我提到Spring的RequestContextListener因为它正是你在说什么:创建一个ThreadLocal的对象,可以在整个请求生命周期的其余部分可以访问存储数据。

+0

你能为我澄清这件事吗? 'ServletRequestListener'监听'ServletRequestEvent',这是一个为每个传入请求触发的事件。如果我想将每个请求的用户代理记录到我的Web应用程序,我应该使用此侦听器还是过滤器? – arun 2014-08-23 20:19:53

+0

两者都可能是好的。 – Dan 2014-09-10 19:09:52