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

新手上路,请多包涵

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

原文由 kandarp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 402
2 个回答

Servlet Filter用于监听客户端对servlet的请求和响应,或修改请求和响应,或审计和记录日志。

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

原文由 Dead Programmer 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

这个来自 Oracle 的资料应该能够阐明更多的 Filters 和 Listeners

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

HTH

原文由 Ayusman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题