【问题标题】:Servlet Filter vs. ServletRequestListenerServlet 过滤器与 ServletRequestListener
【发布时间】:2010-12-30 12:41:01
【问题描述】:

我想在每个请求(通过 ThreadLocal)上将 JPA EntityManager 绑定到当前线程,这可以通过 ServletRequestListener 或 Filter 完成。侦听器看起来更干净,在这种情况下我不需要过滤器的其他可能性。但也许过滤器有一个我错过的优势。

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

【问题讨论】:

  • 是否有关于 ServletRequestListener 的线程保证?您确定它是在与请求处理相同的线程上同步调用的吗?
  • Servlet 3.0 规范说:“11.5 侦听器实例和线程 [...] 容器必须维护对每个侦听器实例的引用,直到为 Web 应用程序提供最后一个请求。属性更改为 ServletContext “但这不是您问题的答案...我认为它会在同一个线程中。

标签: java listener servlet-filters


【解决方案1】:

就您的目的而言,没有太大区别。但是从某种意义上说,侦听器更“干净”,阅读您的代码的人会立即知道这段代码的目的不可能是拦截请求或更改请求或执行过滤器可以执行的其他操作。

例如,Spring 使用 ServletRequestListener 允许不使用 Spring 自己的 Web MVC 框架的基于 Spring Web 的应用程序访问特定于 Web 的功能,例如会话范围的 bean。见this doc。

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

【讨论】:

  • 你能帮我澄清一下吗? ServletRequestListener 侦听ServletRequestEvent,这是为每个传入请求触发的事件。如果我想为我的网络应用程序的每个请求记录用户代理,我应该使用这个监听器还是过滤器?
  • 两者都可以。
猜你喜欢
  • 2011-02-26
  • 2014-08-21
  • 2012-02-15
  • 2014-07-22
  • 2016-06-09
  • 2012-06-24
  • 2012-02-17
  • 2013-04-09
  • 2014-04-07
相关资源
最近更新 更多