81

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

4

10 回答 10

86

Servlet过滤器用于监控客户端对servlet的请求和响应,或者修改请求和响应,或者审计和记录日志。

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

于 2011-01-18T06:13:04.190 回答
37

过滤器用于处理前和处理后的请求。查看javax.servlet.Filter您的 tomcat/jboss/other 容器中的 javadoc。

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

根据@fnt 下面的回复,让我尝试澄清更多。监听器的目标是生命周期变化,而不必有客户端请求进入。因此,对于一个客户端请求,在请求被处理之前可能会发生更多生命周期事件。示例:您想要记录所有超时的会话。请注意,SessionTimeout 是一个生命周期事件,无需用户执行任何操作即可发生。对于这种情况,监听器将是合适的。

关于请求到达时的日志记录问题。新请求没有直接映射到等效的侦听器(读取生命周期事件)事件。因此,对于每个传入的请求,如果您想记录某些内容,我认为 Filter 是正确的使用方法。

来自 Oracle 的这份材料应该能够阐明更多的 过滤器和侦听器

2021 年 3 月 17 日更新 评论中有一些来回。试图澄清。根据定义,过滤器总是会被调用。因此,如果我需要始终记录请求,将其保存在过滤器中将确保我得到记录。如果我把它放在侦听器中,我必须确保在所有可能的侦听器中执行日志记录代码块。这两种方法都会为您提供所需的日志记录,使用过滤器会更有效。

高温高压

于 2011-01-18T06:08:25.783 回答
25

过滤器就像一个水过滤器,传入(请求)和传出(响应)值将被过滤。

Listener就像在听(触发)——只要需要,我就会执行。

于 2012-06-11T06:23:24.970 回答
23

一个重要的区别经常被忽略:当侦听器被触发是针对实际的物理请求时,过滤器与 servlet 容器调度一起工作。对于一个侦听器调用,可能有多个过滤器/servlet 调用。

侦听器与过滤器

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

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

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

有关过滤器的更多信息,请参阅Java EE 7 教程:过滤请求和响应
如果您仍然无法理解过滤器,请参阅映射过滤器调度程序类型- 这是一个较旧的 J2EE 文档,但它更详细。

于 2014-11-25T12:47:53.467 回答
11

Java EE 6中的文本

筛选

过滤器是一个转换请求和响应(标题和内容)的对象。

听众

您可以通过定义在生命周期事件发生时调用其方法的侦听器对象来监视和响应 servlet 生命周期中的事件。

于 2011-01-18T06:19:19.777 回答
8

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

筛选

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

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

过滤器在渲染视图之前但在控制器渲染响应之后运行。

过滤器仅用于 web 层,因为它在 web.xml 中定义。

将您的请求/响应视为黑盒系统时,过滤器更合适。无论 servlet 是如何实现的,它们都可以工作。

过滤器用于执行过滤任务,例如登录验证、审核来自网页的传入请求、转换、日志记录、压缩、加密和解密、输入验证等。

Servlet 过滤器仅在 Web 层中使用,您不能在 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/的区别

于 2016-12-08T05:59:09.510 回答
4

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

来源:网络

于 2011-01-18T06:10:22.247 回答
3

你可以很容易地对这两者的英文含义有一个粗略的了解。

过滤器用于过滤进出 Servlet 的内容/资源。另一方面,Listener 在那里,当 Web 应用程序发生某些事情时(监听)做一些相关的事情。

于 2011-01-18T06:04:47.777 回答
2

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

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

于 2012-09-15T10:22:53.730 回答
1

简而言之,

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

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

于 2013-10-29T08:25:50.767 回答