第6章:SpringBoot 拦截器-监听器实战

文章目录

SpringBoot4.0 拦截器-监听器实战

拦截器的概念和作用

核心概念说明

  • 拦截器(Interceptor)是Spring MVC框架中的重要组件;
  • 用于在请求处理的前后添加预处理和后处理逻辑;
  • 类似于Servlet中的Filter,但功能更强大,可以获取Spring容器中的Bean。

拦截器与过滤器对比

特性 拦截器(Interceptor) 过滤器(Filter)
依赖框架 Spring MVC Servlet规范
作用范围 控制器方法级别 请求级别
获取Bean 可以获取Spring Bean 不能直接获取
执行时机 控制器方法执行前后 请求进入Servlet前后
配置方式 实现HandlerInterceptor web.xml或@WebFilter

拦截器的执行流程:

复制代码
请求 → 过滤器 → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应

拦截器实战

创建拦截器步骤

  1. 实现HandlerInterceptor接口
  2. 重写三个核心方法
  3. 配置拦截器注册

登录验证拦截器

java 复制代码
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        log.info("=== 进入拦截器 ===");
        log.info("请求URL: " + request.getRequestURI());
        log.info("请求方法: " + request.getMethod());

        // 登录验证逻辑
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");

        if (user == null) {
            // 未登录,返回错误信息
            response.setContentType("application/json;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.write("{\"code\": 401, \"message\": \"请先登录\"}");
            writer.flush();
            return false; // 中断请求
        }

        return true; // 继续执行

    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

        log.info("=== 控制器执行完成 ===");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

        log.info("=== 请求处理完成 ===");
        if (ex != null) {
            log.info("异常信息: " + ex.getMessage());
        }
    }
}

配置拦截器注册

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")                    // 拦截所有路径
                .excludePathPatterns(                      // 排除路径
                        "/user/login",
                        "/user/register",
                        "/css/**",
                        "/js/**",
                        "/images/**"
                );
    }
}

测试结果

sh 复制代码
2026-01-18T21:25:46.606+08:00  INFO 21940 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2026-01-18T21:25:46.606+08:00  INFO 21940 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2026-01-18T21:25:46.606+08:00  INFO 21940 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
2026-01-18T21:25:46.616+08:00  INFO 21940 --- [nio-8080-exec-1] c.g.interceptor.LoginInterceptor         : === 进入拦截器 ===
2026-01-18T21:25:46.616+08:00  INFO 21940 --- [nio-8080-exec-1] c.g.interceptor.LoginInterceptor         : 请求URL: /user/info
2026-01-18T21:25:46.616+08:00  INFO 21940 --- [nio-8080-exec-1] c.g.interceptor.LoginInterceptor         : 请求方法: GET
2026-01-18T21:25:53.584+08:00  INFO 21940 --- [nio-8080-exec-3] c.g.interceptor.LoginInterceptor         : === 进入拦截器 ===
2026-01-18T21:25:53.584+08:00  INFO 21940 --- [nio-8080-exec-3] c.g.interceptor.LoginInterceptor         : 请求URL: /user/info
2026-01-18T21:25:53.584+08:00  INFO 21940 --- [nio-8080-exec-3] c.g.interceptor.LoginInterceptor         : 请求方法: GET
2026-01-18T21:25:53.586+08:00  INFO 21940 --- [nio-8080-exec-3] c.g.interceptor.LoginInterceptor         : === 控制器执行完成 ===
2026-01-18T21:25:53.586+08:00  INFO 21940 --- [nio-8080-exec-3] c.g.interceptor.LoginInterceptor         : === 请求处理完成 ===

监听器概念和作用**

核心概念说明

  • 监听器(Listener)用于监听Web应用中的事件
  • 可以监听ServletContext、HttpSession、ServletRequest的生命周期事件
  • 在特定事件发生时执行相应的业务逻辑

监听器类型分类

监听器类型 监听事件 应用场景
ServletContextListener 应用启动和关闭 初始化资源、加载配置
ServletContextAttributeListener 应用域属性变化 监控配置变化
HttpSessionListener Session创建和销毁 在线用户统计
HttpSessionAttributeListener Session属性变化 用户状态跟踪
ServletRequestListener 请求开始和结束 请求统计、日志记录

监听器执行时机

复制代码
应用启动 → Context初始化 → 监听器contextInitialized → 请求到达 → Session创建 → 监听器sessionCreated

监听器实战

java 复制代码
@Component
public class SessionListener implements HttpSessionListener {

    private static final Logger logger = LoggerFactory.getLogger(SessionListener.class);
    private static final AtomicInteger onlineUserCount = new AtomicInteger(0);

    /**
     * Session创建时调用
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        int count = onlineUserCount.incrementAndGet();
        logger.info("新用户登录,当前在线用户数: {}", count);

        // 设置Session超时时间(30分钟)
        se.getSession().setMaxInactiveInterval(30 * 60);
    }

    /**
     * Session销毁时调用
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        int count = onlineUserCount.decrementAndGet();
        logger.info("用户退出,当前在线用户数: {}", count);
    }

    /**
     * 获取当前在线用户数
     */
    public static int getOnlineUserCount() {
        return onlineUserCount.get();
    }
}
java 复制代码
    @GetMapping("/hello")
    public String hello(HttpSession session) {

        return "在线人数:"+ SessionListener.getOnlineUserCount();
    }

自动注册说明

  • SpringBoot4.0自动扫描@Component注解的监听器;
  • 无需额外配置,自动注册到Servlet容器;
  • 支持同时注册多个监听器,按需执行。
相关推荐
HackTorjan6 小时前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
直奔標竿15 小时前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring
敖正炀17 小时前
WebFlux 深度:Reactor 线程模型、背压与错误处理
spring boot
BING_Algorithm17 小时前
一文搞定 AOP 所有核心知识点
spring boot·后端·spring
勿忘初心122118 小时前
【Java实战】SpringBoot 集成 freemarker 导出 Word 模板
java·spring boot·freemarker·模板引擎·word导出·后端实战
绿草在线18 小时前
SpringBoot项目实战:从零搭建高效开发环境
java·spring boot·后端
空中海19 小时前
Spring Boot Kafka 项目 Demo:订单事件系统 专家知识、源码阅读路线与面试题
spring boot·kafka·linq
默 语2 天前
基于 Spring Boot 3 + LangChain4j 快速构建企业级 AI 应用实战
人工智能·spring boot·后端
薪火铺子2 天前
SpringBoot WebServer启动与监听器原理深度解析
spring boot·后端·tomcat
KmSH8umpK2 天前
SpringBoot 分布式锁实战:从单机锁到Redis分布式锁全覆盖,解决超卖、重复下单、幂等并发问题
spring boot·redis·分布式