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

kan*_*arp 73 java servlets servlet-filters servlet-listeners

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

Dea*_*mer 78

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

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

  • 监听器实现 javax.servlet.ServletContextListener 而过滤器实现 javax.servlet.Filter 也毫无价值 (2认同)

Ayu*_*man 34

过滤器用于前后处理请求.查看javax.servlet.Filtertomcat/jboss /其他容器javadoc中的内容.

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

根据@fnt的回复,让我试着澄清一些.监听器的目标是生命周期更改,而无需请求客户端请求.因此,对于一个客户端请求,可能会在处理请求之前发生更多生命周期事件.示例:您希望记录超时的所有会话.请注意,SesionTimeout是一个生命周期事件,无需用户执行任何操作即可发生.对于这种情况,听众将是合适的.

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

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

HTH


小智 22

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

听众就像听(触发) - 只要有需要,我就会被执行.


Vse*_*nov 21

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

听众与过滤器

映射过滤器调度程序类型.该链接有点过时 - 它不包括Servlet 3.0 Async调度程序类型.还可以使用@WebFilter注释指定调度程序类型:

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

@WebFilter(servletNames = { "My Servlet" },
    dispatcherTypes = { DispatcherType.REQUEST, DispatcherType.FORWARD })
Run Code Online (Sandbox Code Playgroud)


ada*_*ost 11

来自Java EE 6的文本

过滤

Filter是一个转换请求和响应的对象(标题和内容).

听众

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


Sun*_*arg 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/