Servlet 过滤器和 Servlet 上下文侦听器有啥区别?

Posted

技术标签:

【中文标题】Servlet 过滤器和 Servlet 上下文侦听器有啥区别?【英文标题】:What is the difference between a Servlet Filter and a Servlet Context Listener?Servlet 过滤器和 Servlet 上下文侦听器有什么区别? 【发布时间】:2012-04-06 10:43:14 【问题描述】:

使用 Servlet 过滤器与使用 Servlet 上下文侦听器有什么区别?

您什么时候会使用其中一种?

【问题讨论】:

【参考方案1】:

Filter 拦截与其 URL 模式匹配的 HTTP 请求,并允许您修改它们。另见其javadoc:

过滤器是一个对象,它对资源的请求(servlet 或静态内容)或来自资源的响应或两者都执行过滤任务。

过滤器在doFilter 方法中执行过滤。每个Filter 都可以访问FilterConfig 对象,从中可以获取其初始化参数,以及对ServletContext 的引用,例如,它可以用来加载过滤任务所需的资源。

过滤器在 Web 应用程序的部署描述符中配置。

已为此设计确定的示例有:

身份验证过滤器 日志记录和审核过滤器 图像转换滤镜 数据压缩过滤器 加密过滤器 标记过滤器 触发资源访问事件的过滤器 XSL/T 过滤器 Mime 型链式过滤器

ServletContextListener 拦截 webapp 的启动和关闭,并允许您在启动和/或关闭时执行一些代码。另见其javadoc:

用于接收有关ServletContext 生命周期更改的通知事件的接口。

为了接收这些通知事件,实现类必须在 Web 应用程序的部署描述符中声明,使用WebListener 进行注释,或者通过ServletContext 上定义的addListener 方法之一注册。

此接口的实现在其contextInitialized(javax.servlet.ServletContextEvent) 方法中按声明顺序调用,在其contextDestroyed(javax.servlet.ServletContextEvent) 方法中按相反顺序调用。

现在应该很明显何时使用其中之一。如果您想拦截处理特定 URL 模式的 HTTP 请求,请使用 Filter,因为您想检查/修改 HTTP 请求/响应。如果您想在 webapp 的启动和/或关闭时拦截,请使用 ServletContextListener

请知道在哪里可以找到 javadocs 以及如何解释它们。它们包含此类琐碎问题的所有答案。

【讨论】:

您提供了比 Java 文档中更多有用的信息。所以谢谢。

以上是关于Servlet 过滤器和 Servlet 上下文侦听器有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

无法过滤上下文根 Servlet 请求

过滤器监听器上下文servlet线程安全问题

Servlet 过滤器 - 上下文初始化

java中的Servlet/过滤器特定异常处理

java中的Servlet/过滤器特定异常处理

在 servlet 过滤器中设置托管 Bean 的值。 [关闭]