拦截器、监听器、过滤器
在 Java Web 开发中,拦截器(Interceptor)、过滤器(Filter)和监听器(Listener)都是用于处理请求、响应、应用程序生命周期的组件,但它们在使用场景、功能和作用范围上有明显的区别。下面我将逐一说明它们的异同。
1. 过滤器(Filter)
作用范围
- 过滤器属于 Servlet 规范的一部分,作用于请求和响应的整个生命周期,可以在请求到达 Servlet 之前或者响应返回客户端之前进行处理。
主要用途
- 过滤器主要用于对 HTTP 请求和响应进行预处理和后处理,常见的使用场景包括:
- 请求日志记录
- 身份验证和授权
- 跨域请求处理(CORS)
- 输入输出数据的编码/解码处理
- 防止 XSS 攻击或 SQL 注入等安全措施
处理流程
- 过滤器链:多个过滤器可以按照一定顺序组成一个过滤器链,在请求和响应过程中逐个执行。
- 过滤器在请求到达 Servlet 之前、响应从 Servlet 返回客户端之前被调用。
特点
- 过滤器是基于
javax.servlet.Filter
接口的。 - 过滤器是与 HTTP 请求和响应直接交互的,它无法访问 Spring 的上下文。
- 过滤器通常不适用于具体的业务逻辑(如处理用户输入),更多的是用于跨切面功能(如日志、安全)。
示例
@WebFilter("/api/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 前置处理
System.out.println("Request is being filtered");
chain.doFilter(request, response); // 继续请求链条
// 后置处理
System.out.println("Response is being filtered");
}
@Override
public void destroy() {}
}
2. 拦截器(Interceptor)
作用范围
- 拦截器是 Spring Framework 的一部分,专门用于处理 Spring MVC 中的请求,通常用于 Controller 方法的执行过程(即在请求到达 Controller 之前和响应返回客户端之前进行处理)。
主要用途
- 拦截器主要用于业务逻辑相关的拦截和处理,常见场景包括:
- 权限检查
- 日志记录
- 请求数据的预处理与响应数据的后处理
- 参数验证
处理流程
- 拦截器是在 Spring MVC 的处理器(Controller)执行之前和之后执行的。
- 每个请求会经过拦截器的链,拦截器按顺序执行。拦截器也可以中断请求链条,比如在用户未授权的情况下直接返回错误。
特点
- 拦截器是基于
org.springframework.web.servlet.HandlerInterceptor
接口的。 - 拦截器是与 Spring MVC 结合紧密的,它可以直接访问 Spring 的上下文,能够获取 Controller 中的参数、请求属性等。
- 拦截器更适合用于业务相关的逻辑处理。
示例
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Before controller method execution");
return true; // 返回 true 继续处理,false 直接结束请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("After controller method execution");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("After response is rendered");
}
}
3. 监听器(Listener)
作用范围
- 监听器主要用于监听 Servlet 容器中事件的发生。它可以监听 Web 应用的生命周期、Session 生命周期、Request 生命周期等。
主要用途
- 监听器主要用于监听 Web 应用的生命周期和 Session、Request、ServletContext 的事件,常见场景包括:
- 监听应用启动和销毁事件
- 监听 Session 创建和销毁事件
- 监听 Request 请求事件
- 监听 ServletContext 的属性变化等
处理流程
- 监听器通常与 Servlet 容器的生命周期密切相关,它响应特定的事件,如 Web 应用启动、Session 创建等。
- 比如,在应用启动时初始化数据,在用户会话结束时清理数据等。
特点
- 监听器是基于
javax.servlet.ServletContextListener
、javax.servlet.http.HttpSessionListener
等接口的。 - 监听器不直接操作请求和响应,更多地关注应用、会话等的生命周期事件。
- 监听器通常与业务逻辑无关,更偏向于事件驱动的处理。
示例
@WebListener
public class MyListener implements ServletContextListener, HttpSessionListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Web application started");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Web application stopped");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session created: " + se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session destroyed: " + se.getSession().getId());
}
}
4. 拦截器、过滤器、监听器的比较
特性 | 过滤器 (Filter) | 拦截器 (Interceptor) | 监听器 (Listener) |
---|---|---|---|
适用范围 | HTTP 请求与响应处理 | Spring MVC 请求处理(Controller) | Web 应用的生命周期、Session、Request 等事件 |
主要功能 | 请求/响应的预处理和后处理 | 处理请求前后与视图渲染后的逻辑 | 监听应用启动/销毁、Session 创建/销毁等事件 |
执行顺序 | 请求处理链的前置和后置操作(可以中断请求) | Controller 方法执行前和执行后(可以中断请求) | 监听应用级别的事件,如 Session、ServletContext |
依赖关系 | 独立于 Spring 的 Servlet 规范 | 基于 Spring MVC 处理请求 | 独立于 Spring,基于 Servlet 规范 |
可用性 | 请求和响应对象的访问,可用于跨切面功能(如日志) | 适用于业务逻辑的处理(如权限检查、日志记录等) | 处理生命周期事件,不处理请求/响应内容 |
5. 总结
- 过滤器(Filter):处理 HTTP 请求和响应的前后,可以用于跨切面处理(如日志、权限验证等)。属于 Servlet 规范。
- 拦截器(Interceptor):专门用于 Spring MVC 的请求处理过程,通常用于处理与业务逻辑相关的内容,如权限控制、参数验证等。
- 监听器(Listener):用于监听 Web 应用和 HTTP 会话等事件的发生,关注应用生命周期、会话生命周期等事件。
在实际项目中,通常是根据不同的需求选择不同的机制:
- 如果是 HTTP 请求和响应的处理,通常选择 过滤器;
- 如果是业务逻辑相关的请求处理,通常选择 拦截器;
- 如果是应用、会话等生命周期的事件,通常选择 监听器。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具