Servlet 中过滤器与监听器的区别(JavaEE)

Servlet 有过滤器和监听器功能,我想知道过滤器和监听器之间的确切区别。

102027 次浏览

你可以很容易地对这两个词的英语含义有一个粗略的概念。

Filter 是用来过滤从 Servlet 进出的内容/资源的。另一方面,当 Web 应用程序出现问题时(监听) ,监听器就会在那里做一些相关的事情。

过滤器用于处理前后请求 Tomcat/jboss/其他容器 javadoc。

中的事件附加到触发器 您的应用程序服务器(让我们在这里使用术语容器)。使用侦听器,您可以跟踪应用程序级别、会话级别、生命周期更改、属性更改等。实现的接口是 javax.servlet.Listener接口。

基于以下@fnt 的回复,让我试着澄清一些问题。 监听器是针对生命周期更改的,不需要传入客户机请求。因此,对于一个客户端请求,在处理请求之前可能会发生更多的生命周期事件。 例如: 您希望记录所有超时的会话。请注意,SesionTimeout 是一个生命周期事件,它可以在用户不做任何事情的情况下发生。对于这样的场景,侦听器将是合适的。

请求到达时的日志记录问题。没有将新请求直接映射到等效的侦听器(读取生命周期事件)事件。因此,对于每个传入的请求,如果你想记录一些东西,筛选在我看来是正确的事情使用。

这些来自 Oracle 的材料应该能够澄清更多信息 过滤器和监听器

2021年3月17日最新情况 在评论中有一些反复,试图澄清。 根据定义,过滤器将始终被调用。因此,如果我需要记录请求始终,保持它在过滤器将确保我得到的日志。如果我把它放在侦听器中,我必须确保日志代码块在所有可能的侦听器中执行。这两种方法都可以获得所需的日志记录,使用过滤器将更有效率。

高温

虽然可以在侦听器中修改当前事件对象,但是 不能停止侦听器中当前事件处理程序的执行。 您也不能从侦听器中清除事件队列 强加的能力差异,他们也是为了 监听器倾向于关注 事件处理程序和模型,而过滤器倾向于关注 事件处理程序和控制器之间的交互。

资料来源:

Servlet Filter 用于监视客户机对 Servlet 的请求和响应,或者修改请求和响应,或者审计和记录。

Servlet 监听器用于监听 Web 容器中的事件,比如当您创建一个会话时,或者将一个属性放在一个会话中时,或者当您在另一个容器中进行钝化和激活时,为了订阅这些事件,您可以在 web.xml中配置监听器,例如 HttpSessionListener

来自 JavaEE6的短信

过滤器

Filter 是转换请求和响应(标头和内容)的对象。

听众们

您可以通过定义侦听器对象来监视 servlet 生命周期中的事件并对其作出反应,这些侦听器对象的方法在生命周期事件发生时被调用。

Filter 与水过滤器类似,其中将过滤传入(请求)和传出(响应)值。

Listener 就像侦听(触发器)-只要需要,就会执行。

Filter: Filter 只是过滤来自客户端到 servlet 的响应和请求。

侦听器: 就像一个触发器,当任何触发器发生时,它采取行动。

简而言之,

过滤器用于 Servlet,拦截请求和响应。

监听器用于 Web 应用程序,在上下文级、会话级等事件上执行重要任务。

一个重要的区别经常被忽略: 当侦听器为实际的物理请求触发时,过滤器使用 servlet 容器分派。对于一个侦听器调用,可能有多个过滤器/servlet 调用。

Listeners vs Filters

您可以使用 @WebFilter注释指定调度程序类型:

import javax.servlet.DispatcherType;
import javax.servlet.annotation.WebFilter;


@WebFilter(servletNames = { "My Servlet" },
dispatcherTypes = { DispatcherType.REQUEST, DispatcherType.FORWARD })

有关过滤器的更多信息,请参见 JavaEE7教程: 过滤请求和响应
如果您仍然在理解过滤器方面有困难,请参阅 映射筛选器调度程序类型-这是一个较老的 J2EE 文档,但是它会进入更多的细节。

在阅读了所有的答案和博客之后,这就是我得到的

过滤器

过滤器是动态拦截请求和 对象中包含的信息进行转换或使用的响应 请求或答复。

过滤器通常不会自己创建响应,而是 提供普遍的功能,可以“附加”到任何类型的 Servlet 或 JSP 页面。

筛选器在呈现视图之前但在呈现控制器之后运行 回应。

Filter 仅在 web.xml 中定义的 Web 层中使用。

将请求/响应视为 不管 servlet 是什么样的,它们都会工作 实施。

筛选器用于执行筛选任务,如登录 认证、审核来自网页的要求, 转换,记录,压缩,加密和解密,输入 验证等。

Servlet 过滤器只用于 web 层,你不能使用它 在网络环境之外。

更多关于过滤器 http://array151.com/blog/servlet-filter/的细节

听众

Servlet 监听器用于监听 Web 容器中的事件, 例如,在创建会话或在会话中放置属性时 或者如果你在另一个容器中进行钝化和激活,则订阅 这些事件可以在 web.xml 中配置侦听器,例如, HttpSessionListener.

对于实际的物理请求,侦听器会被触发 附加到应用程序服务器中的事件。通过监听器,您可以跟踪 应用程序级别、会话级别、生命周期更改、属性 变更等。

您可以通过以下方法监视 servlet 生命周期中的事件并对其作出反应 定义其方法在生命周期中被调用的侦听器对象 事情发生了。

更多细节: http://array151.com/blog/servlet-listener/

这就是 http://array151.com/blog/difference-between-servlet-filter-and-servlet-listener/的不同之处

大多数答案都涵盖了这个主题。但是我发现在使用 Filter和使用 ServletRequestListener之间有一些实际的区别。

第一种情况是侦听器永远不能访问 servlet 响应对象。因此,必须的使用 Filter来获得返回给外部调用方的访问 HTTP 状态。

其次,在触发第一个筛选器之前,所有侦听器都将调用各自的 requestInitialized方法。同样,在完成最后一个筛选器之后调用侦听器的 requestDestroyed方法。

因此,为了确保 所有过滤器可以使用某些请求属性,使用侦听器可以避免使用过滤器顺序进行游戏。

同样,为了删除该属性/删除一些共享资源,使用侦听器 requestDestroyed方法可以确保所有过滤器都使用它,而不管它们运行的顺序如何。