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

Servlet(JavaEE)中过滤器和监听器的区别,java,servlets,servlet-filters,servlet-listeners,Java,Servlets,Servlet Filters,Servlet Listeners,Servlet中有过滤器和侦听器功能。我想知道过滤器和监听器之间的确切区别。你可以很容易地大致了解这两个词的英语意思 Filter用于过滤来自Servlet的内容/资源。另一方面,监听器在那里,当web应用程序发生问题时,它可以做一些相关的事情(监听)。过滤器用于预处理和后处理请求。查看您的应用程序中的javax.servlet.Filter tomcat/jboss/other容器javadoc 其中,as侦听器类似于可以附加到中的事件的触发器 你的应用服务器(让我们在这里使用术语容器)。使用

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

你可以很容易地大致了解这两个词的英语意思


Filter用于过滤来自Servlet的内容/资源。另一方面,监听器在那里,当web应用程序发生问题时,它可以做一些相关的事情(监听)。

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

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

根据@fnt在下面的回答,让我尝试进一步澄清。 监听器是生命周期更改的目标,无需客户端请求。因此,对于一个客户端请求,在处理该请求之前可能会发生更多的生命周期事件。 例子: 您想记录超时的所有会话。请注意,SesionTimeout是一个生命周期事件,它可以在用户不做任何事情的情况下发生。对于这种情况,侦听器是合适的

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

这篇来自Oracle的材料应该能够澄清更多

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


HTH

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


来源:

Servlet过滤器用于监视从客户端到Servlet的请求和响应,或者修改请求和响应,或者审核和记录

Servlet Listener用于侦听web容器中的事件,例如,当您创建会话时,或者在会话中放置属性时,或者如果您在另一个容器中被动和激活,则要订阅这些事件,您可以在
web.xml
中配置Listener,例如
HttpSessionListener

文本

过滤器

筛选器是一个对象,用于转换请求和响应(头和内容)

听众


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

过滤器类似于水过滤器,将过滤传入(请求)和传出(响应)值


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

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

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

简而言之

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


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

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

。该链接有点过时-它不包括Servlet3.0
Async
dispatcher类型。 还可以使用
@WebFilter
注释指定调度程序类型:

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

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

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

过滤器

筛选器是一个动态截获请求和请求的对象 转换或使用中包含的信息的响应 请求或响应

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

过滤器在渲染视图之前但在渲染控制器之后运行 答复

过滤器仅在web层中使用,因为它是在web.xml中定义的

当您将请求/响应视为 黑箱系统。不管servlet是如何工作的,它们都会工作 执行

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

Servlet过滤器仅用于web层,您不能使用它 在web上下文之外

有关过滤器的详细信息,请参见

听众

Servlet侦听器用于侦听web容器中的事件, 例如,在创建会话或在会话中放置属性时 或者如果你在另一个co中钝化和激活