拦截器、监听器、过滤器

在 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.ServletContextListenerjavax.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 请求和响应的处理,通常选择 过滤器
  • 如果是业务逻辑相关的请求处理,通常选择 拦截器
  • 如果是应用、会话等生命周期的事件,通常选择 监听器
posted @   CyrusHuang  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示