Servlet (Java EE) 中 Filter 和 Listener 的区别

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


答案 1

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

Servlet 侦听器用于侦听 Web 容器中的事件,例如,当您创建会话或将属性放在会话中时,或者如果您在另一个容器中钝化和激活,以订阅这些事件,您可以在 中配置侦听器,例如。web.xmlHttpSessionListener


答案 2

筛选器用于处理前和后处理请求。看看在你的tomcat/jboss/other container javadoc中。javax.servlet.Filter

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

根据@fnt在下面的回应,让我试着再澄清一些。侦听器是生命周期更改的目标,而不必有客户端请求进入。因此,对于一个客户端请求,在释放请求之前,可能会发生更多的生命周期事件。示例:您希望记录所有超时的会话。请注意,SesionTimeout 是一个生命周期事件,可以在不让用户执行任何操作的情况下发生。对于这种情况,侦听器将是合适的。

关于请求到达时进行日志记录的问题。没有将新请求直接映射到等效侦听器(读取生命周期事件)事件。因此,对于每个传入的请求,如果您想记录某些内容,在我看来,过滤器是正确的选择。

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

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

呵呵


推荐