【问题标题】:Difference between Filter and Listener in Servlet (Java EE)Servlet(Java EE)中过滤器和监听器的区别
【发布时间】:2011-06-10 21:26:52
【问题描述】:

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

【问题讨论】:

    标签: java servlets servlet-filters servlet-listeners


    【解决方案1】:

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

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

    【讨论】:

    • 而且,监听器实现 javax.servlet.ServletContextListener 而过滤器实现 javax.servlet.Filter 也是一文不值
    • 你能帮我澄清一下吗? ServletRequestListener 侦听ServletRequestEvent,这是为每个传入请求触发的事件。如果我想为我的网络应用程序的每个请求记录用户代理,我应该使用这个监听器还是过滤器?
    • @BalusC 定义监听器是强制性的吗?如果我没有在 Spring 应用程序中定义监听器,它会给我错误 No WebApplicationContext found: no ContextLoaderListener registered?
    • 嗯,我真的不明白为什么您需要在创建会话时监听或在创建会话中的属性时监听。您能否举例说明您在开发的任何应用程序中何时使用了监听器?
    【解决方案2】:

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

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

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

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

    来自 Oracle 的这份材料应该能够澄清更多 Filters and Listeners

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

    HTH

    【讨论】:

    • 因此,如果想记录每个请求的某些内容,应该使用ServletRequestListener 还是过滤器?
    • @Ayusman 此声明可能需要证明
    • @fnt 因为 arun 要求在每个请求的基础上进行日志记录,我认为过滤器符合要求。
    • @Ayusman 您仍然没有解释为什么应该首选过滤器。使用请求侦听器,同样可以完成同样的任务。
    • @fnt 非常好,在我过去的经验中,我使用过滤器进行日志记录。为什么?我认为约定比什么都重要。侦听器也可以用于此任务。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      import javax.servlet.DispatcherType;
      import javax.servlet.annotation.WebFilter;
      
      @WebFilter(servletNames = { "My Servlet" },
          dispatcherTypes = { DispatcherType.REQUEST, DispatcherType.FORWARD })
      

      有关过滤器的更多信息,请参阅Java EE 7 Tutorial: Filtering Requests and Responses
      如果您仍然无法理解过滤器,请参阅 Mapping filters dispatcher types - 这是一个较旧的 J2EE 文档,但它更详细。

      【讨论】:

        【解决方案5】:

        来自Java EE 6的短信

        过滤器

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

        听众

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

        【讨论】:

          【解决方案6】:

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

          过滤器

          过滤器是一个动态拦截请求和 响应以转换或使用包含在 请求或响应。​​

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

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

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

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

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

          一个Servlet过滤器只用在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/

          【讨论】:

            【解决方案7】:

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

            来源:web

            【讨论】:

              【解决方案8】:

              你可以很容易地对这两者的英文意思有个大概的了解。

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

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                  【解决方案10】:

                  总之,

                  Filter 用于 Servlet,拦截请求和响应。

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

                  【讨论】:

                    猜你喜欢
                    • 2011-07-24
                    • 2015-04-18
                    • 2012-04-06
                    • 2014-05-04
                    • 2019-02-11
                    • 2015-11-30
                    • 2017-04-10
                    • 1970-01-01
                    • 2013-05-28
                    相关资源
                    最近更新 更多