Java拦截器、过滤器和监听器的区别与作用详解

 更新时间:2025年06月03日 09:46:00   作者:Java皇帝  
Java 拦截器、过滤器和监听器是在 Java Web 开发中常用的组件,它们各有特点和用途,下面将分别介绍它们的区别和作用,并提供具体的代码示例,需要的朋友可以参考下

一、定义与区别

  • 拦截器:基于 Java 的反射机制,属于 AOP(面向切面编程)思想的应用。在 Spring 等框架中广泛应用,主要用于拦截用户请求,在目标方法执行前后进行自定义逻辑处理。

  • 过滤器:由 Servlet 容器调用,可用于拦截请求和响应。在请求处理之前或之后执行代码,如编码转换、权限验证等。

  • 监听器:用于监听某些事件的发生,如 ServletContext、HttpSession 和 ServletRequest 等。在特定事件触发时执行逻辑,如统计在线人数。

它们的主要区别如下:

组件基于技术拦截范围生命周期管理
拦截器反射机制(AOP)框架中的方法调用(如 Spring)由框架管理
过滤器Servlet 容器客户端请求和服务器响应由 Servlet 容器管理
监听器事件监听机制应用程序事件(如会话创建)由 Servlet 容器管理

二、具体用途与作用

1. 拦截器

  • 用途:用于执行跨横切逻辑,如日志记录、权限检查、性能监控等。
  • 作用:在请求处理的各个阶段(如请求前、请求后、异常处理后)执行自定义逻辑。

代码示例

import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor implements HandlerInterceptor {
    // 在请求处理之前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("请求处理前执行");
        return true; // 返回 false 可以阻止请求继续处理
    }

    // 在请求处理之后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("请求处理后执行");
    }

    // 在整个请求完成之后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("请求处理完成执行");
    }
}

在 Spring 配置文件中注册拦截器:

<mvc:interceptors>
    <bean class="com.example.MyInterceptor"/>
</mvc:interceptors>

2. 过滤器

  • 用途:用于对请求和响应进行预处理和后处理,如编码转换、权限验证、日志记录等。
  • 作用:在请求到达 Servlet 之前或响应返回客户端之前进行处理。

代码示例

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyFilter implements Filter {
    // 过滤器初始化
    @Override
    public void init(FilterConfig filterConfig) {
        System.out.println("过滤器初始化");
    }

    // 拦截请求和响应
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        System.out.println("请求前处理");
        chain.doFilter(request, response); // 放行请求
        System.out.println("响应后处理");
    }

    // 过滤器销毁
    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}

在 web.xml 中配置过滤器:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3. 监听器

  • 用途:用于监听应用程序事件,如会话创建、销毁、属性变更等。
  • 作用:在特定事件发生时执行逻辑,如统计在线人数、初始化资源等。

代码示例

import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;

public class MyListener implements HttpSessionListener {
    private static int onlineCount = 0;

    // 会话创建时触发
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        onlineCount++;
        System.out.println("会话创建,当前在线人数:" + onlineCount);
    }

    // 会话销毁时触发
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        onlineCount--;
        System.out.println("会话销毁,当前在线人数:" + onlineCount);
    }
}

在 web.xml 中配置监听器:

<listener>
    <listener-class>com.example.MyListener</listener-class>
</listener>

三、总结

  • 拦截器:适合处理与业务逻辑相关的横切关注点,如权限验证、日志记录等。
  • 过滤器:更贴近网络层,适合对请求和响应进行预处理和后处理,如编码转换、安全过滤等。
  • 监听器:用于监听特定事件的发生,适合需要在特定事件发生时执行逻辑的场景,如统计在线人数、资源初始化等。

根据实际需求选择合适的组件,可以更好地组织代码和提高开发效率。

到此这篇关于Java拦截器、过滤器和监听器的区别与作用详解的文章就介绍到这了,更多相关Java拦截器、过滤器和监听器区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot中使用SSE(Server-Sent Events)实现聊天功能:替代websocket服务器推送

    Spring Boot中使用SSE(Server-Sent Events)实现聊天功能:替代webs

    本文讲解了如何在Spring Boot项目中使用SSE实现聊天功能,SSE适用于客户端只需要接收更新的应用场景,而WebSocket则适合全双工通信,客户端通过服务端的/subscribe接口维持长连接,服务端通过SseEmitter对象发送消息
    2026-03-03
  • java版简单的猜数字游戏实例代码

    java版简单的猜数字游戏实例代码

    猜数字游戏是一款经典的游戏,该游戏说简单也很简单,说不简单确实也很难,那么下面这篇文章主要给大家介绍了java版简单的猜数字游戏的相关资料,文中给出了详细的实现分析和示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-05-05
  • 5分钟快速搭建SpringBoot3 + MyBatis-Plus工程/项目的实现示例

    5分钟快速搭建SpringBoot3 + MyBatis-Plus工程/项目的实现示例

    本文主要介绍了使用IntelliJ IDEA创建Spring Boot工程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • java实现腾讯ocr图片识别接口调用

    java实现腾讯ocr图片识别接口调用

    这篇文章主要为大家详细介绍了java实现腾讯ocr图片识别接口调用,拍车牌识别车牌号功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Mybatis-Plus根据自定义注解实现自动加解密的示例代码

    Mybatis-Plus根据自定义注解实现自动加解密的示例代码

    我们把数据存到数据库的时候,有些敏感字段是需要加密的,从数据库查出来再进行解密,如果我们使用的是Mybatis框架,那就跟着一起探索下如何使用框架的拦截器功能实现自动加解密吧,需要的朋友可以参考下
    2024-06-06
  • IDEA生成项目maven-tree依赖目录树结构方式

    IDEA生成项目maven-tree依赖目录树结构方式

    这篇文章主要介绍了IDEA生成项目maven-tree依赖目录树结构方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java中泛型学习之细节篇

    Java中泛型学习之细节篇

    泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用,下面这篇文章主要给大家介绍了关于Java中泛型细节的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Spring中的EventListenerMethodProcessor组件详解

    Spring中的EventListenerMethodProcessor组件详解

    这篇文章主要介绍了Spring中的EventListenerMethodProcessor组件详解,EventListenerMethodProcessor 是 Spring 事件机制中非常重要的一个组件,它管理了一组EventListenerFactory组件,用来将应用中每个使用@EventListener注解定义的事件监听,需要的朋友可以参考下
    2023-12-12
  • Java中常量池、堆和栈的区别对比与联系

    Java中常量池、堆和栈的区别对比与联系

    Java中堆存储对象实例和字符串(JDK7+),栈保存方法调用信息与局部变量,常量池缓存编译期常量,三者通过引用关联,堆与栈区分对象创建与存储,常量池优化内存复用,本文给大家介绍Java中常量池、堆和栈的区别对比与联系,感兴趣的朋友一起看看吧
    2025-09-09
  • 使用反射方式获取JPA Entity的属性和值

    使用反射方式获取JPA Entity的属性和值

    这篇文章主要介绍了使用反射方式获取JPA Entity的属性和值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论