Servlet(Java EE)中的筛选器和侦听器之间的区别


Answers:


82

Servlet筛选器用于监视客户端到Servlet的请求和响应,或修改请求和响应,或审计和记录。

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


2
侦听器实现javax.servlet.ServletContextListener,而过滤器实现javax.servlet.Filter,这也毫无价值
2013年

您能为我澄清一下吗?ServletRequestListener侦听ServletRequestEvent每个传入请求触发的事件。如果我想将每个请求的用户代理登录到我的Web应用程序,我应该使用此侦听器还是过滤器?
2014年

1
@BalusC定义侦听器是强制性的吗?No WebApplicationContext found: no ContextLoaderListener registered?如果我未在Spring应用程序中定义侦听器,则会给我错误。
Half Blood Prince

嗯,我真的不明白为什么您需要在创建会话时进行监听或在创建会话中的属性时进行监听。您能否举例说明何时在开发的任何应用程序中使用侦听器?
乔纳森·拉利伯特

35

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

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

根据下面@fnt的响应,让我尝试澄清更多内容。侦听器的目标是生命周期更改,而不必传入客户端请求。因此,对于一个客户端请求,在处理请求之前,可能还会发生更多的生命周期事件。示例:您要记录该超时的所有会话。请注意,SesionTimeout是生命周期事件,无需用户执行任何操作即可发生。对于这种情况,侦听器将是适当的。

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

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

高温超导


1
因此,如果要记录每个请求的内容,应该使用ServletRequestListener还是过滤?
2014年

1
@Ayusman此声明可能需要辩解

@fnt因为arun要求在每个请求的基础上进行日志记录,所以我认为过滤器很合适。
Ayusman 2015年

1
@Ayusman您仍然没有解释为什么应该首选过滤器。使用请求侦听器,同样可以完成相同的任务。

1
@fnt非常好,根据我过去的经验,我使用过滤器进行日志记录。为什么?我认为惯例比什么都重要。侦听器也可以用于此任务。
Mukul Tripathi

23

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

侦听器就像侦听(触发)一样-只要需要,我都会被执行。


21

一个重要的差异通常被忽略:在为实际的物理请求触发侦听器的同时,过滤器与servlet容器分派一起工作。对于一个侦听器调用,可能有多个过滤器/ servlet调用。

侦听器与过滤器

映射过滤器调度程序类型。链接有些陈旧-它不包括Servlet 3.0Async调度程序类型。也可以使用@WebFilter批注指定调度程序类型:

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

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

11

Java EE 6中的文本

过滤

过滤器是转换请求和响应(标头以及内容)的对象。

听众

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


8

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

过滤

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

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

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

仅在web.xml中定义的Web层中使用过滤器。

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

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

Servlet过滤器仅在Web层中使用,您不能在Web上下文之外使用它。

有关过滤器的更多详细信息,请访问http://array151.com/blog/servlet-filter/

听众

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

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

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

有关更多详细信息:http : //array151.com/blog/servlet-listener/

这是http://array151.com/blog/difference-between-servlet-filter-and-servlet-listener/


4

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

资料来源:网页


3

您可以很容易地对这两者的英文含义有所了解。

过滤器用于过滤从Servlet传入/传出的内容/资源。另一方面,侦听器在那里,可以在Web应用程序发生某些事情(侦听)时执行一些相关的操作。


2

Filter:Filter只是过滤从客户端到Servlet的响应和请求。

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


1

简而言之,

筛选器用于Servlet,拦截请求和响应。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.