Servlet 有过滤器和监听器功能,我想知道过滤器和监听器之间的确切区别。
你可以很容易地对这两个词的英语含义有一个粗略的概念。
Filter 是用来过滤从 Servlet 进出的内容/资源的。另一方面,当 Web 应用程序出现问题时(监听) ,监听器就会在那里做一些相关的事情。
过滤器用于处理前后请求 Tomcat/jboss/其他容器 javadoc。
中的事件附加到触发器 您的应用程序服务器(让我们在这里使用术语容器)。使用侦听器,您可以跟踪应用程序级别、会话级别、生命周期更改、属性更改等。实现的接口是 javax.servlet.Listener接口。
javax.servlet.Listener
基于以下@fnt 的回复,让我试着澄清一些问题。 监听器是针对生命周期更改的,不需要传入客户机请求。因此,对于一个客户端请求,在处理请求之前可能会发生更多的生命周期事件。 例如: 您希望记录所有超时的会话。请注意,SesionTimeout 是一个生命周期事件,它可以在用户不做任何事情的情况下发生。对于这样的场景,侦听器将是合适的。
请求到达时的日志记录问题。没有将新请求直接映射到等效的侦听器(读取生命周期事件)事件。因此,对于每个传入的请求,如果你想记录一些东西,筛选在我看来是正确的事情使用。
这些来自 Oracle 的材料应该能够澄清更多信息 过滤器和监听器
2021年3月17日最新情况 在评论中有一些反复,试图澄清。 根据定义,过滤器将始终被调用。因此,如果我需要记录请求始终,保持它在过滤器将确保我得到的日志。如果我把它放在侦听器中,我必须确保日志代码块在所有可能的侦听器中执行。这两种方法都可以获得所需的日志记录,使用过滤器将更有效率。
高温
虽然可以在侦听器中修改当前事件对象,但是 不能停止侦听器中当前事件处理程序的执行。 您也不能从侦听器中清除事件队列 强加的能力差异,他们也是为了 监听器倾向于关注 事件处理程序和模型,而过滤器倾向于关注 事件处理程序和控制器之间的交互。
资料来源: 网
Servlet Filter 用于监视客户机对 Servlet 的请求和响应,或者修改请求和响应,或者审计和记录。
Servlet 监听器用于监听 Web 容器中的事件,比如当您创建一个会话时,或者将一个属性放在一个会话中时,或者当您在另一个容器中进行钝化和激活时,为了订阅这些事件,您可以在 web.xml中配置监听器,例如 HttpSessionListener。
web.xml
HttpSessionListener
来自 JavaEE6的短信
过滤器
Filter 是转换请求和响应(标头和内容)的对象。
听众们
您可以通过定义侦听器对象来监视 servlet 生命周期中的事件并对其作出反应,这些侦听器对象的方法在生命周期事件发生时被调用。
Filter 与水过滤器类似,其中将过滤传入(请求)和传出(响应)值。
Listener 就像侦听(触发器)-只要需要,就会执行。
Filter: Filter 只是过滤来自客户端到 servlet 的响应和请求。
侦听器: 就像一个触发器,当任何触发器发生时,它采取行动。
简而言之,
过滤器用于 Servlet,拦截请求和响应。
监听器用于 Web 应用程序,在上下文级、会话级等事件上执行重要任务。
一个重要的区别经常被忽略: 当侦听器为实际的物理请求触发时,过滤器使用 servlet 容器分派。对于一个侦听器调用,可能有多个过滤器/servlet 调用。
您可以使用 @WebFilter注释指定调度程序类型:
@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 层,你不能使用它 在网络环境之外。
过滤器是动态拦截请求和 对象中包含的信息进行转换或使用的响应 请求或答复。
过滤器通常不会自己创建响应,而是 提供普遍的功能,可以“附加”到任何类型的 Servlet 或 JSP 页面。
筛选器在呈现视图之前但在呈现控制器之后运行 回应。
Filter 仅在 web.xml 中定义的 Web 层中使用。
将请求/响应视为 不管 servlet 是什么样的,它们都会工作 实施。
筛选器用于执行筛选任务,如登录 认证、审核来自网页的要求, 转换,记录,压缩,加密和解密,输入 验证等。
Servlet 过滤器只用于 web 层,你不能使用它 在网络环境之外。
更多关于过滤器 http://array151.com/blog/servlet-filter/的细节
听众 Servlet 监听器用于监听 Web 容器中的事件, 例如,在创建会话或在会话中放置属性时 或者如果你在另一个容器中进行钝化和激活,则订阅 这些事件可以在 web.xml 中配置侦听器,例如, HttpSessionListener. 对于实际的物理请求,侦听器会被触发 附加到应用程序服务器中的事件。通过监听器,您可以跟踪 应用程序级别、会话级别、生命周期更改、属性 变更等。 您可以通过以下方法监视 servlet 生命周期中的事件并对其作出反应 定义其方法在生命周期中被调用的侦听器对象 事情发生了。
听众
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之间有一些实际的区别。
Filter
ServletRequestListener
第一种情况是侦听器永远不能访问 servlet 响应对象。因此,必须的使用 Filter来获得返回给外部调用方的访问 HTTP 状态。
其次,在触发第一个筛选器之前,所有侦听器都将调用各自的 requestInitialized方法。同样,在完成最后一个筛选器之后调用侦听器的 requestDestroyed方法。
requestInitialized
requestDestroyed
因此,为了确保 所有过滤器可以使用某些请求属性,使用侦听器可以避免使用过滤器顺序进行游戏。
同样,为了删除该属性/删除一些共享资源,使用侦听器 requestDestroyed方法可以确保所有过滤器都使用它,而不管它们运行的顺序如何。