news 2026/2/3 4:56:14

SpringBoot 拦截器-监听器实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot 拦截器-监听器实战

文章目录

  • SpringBoot4.0 拦截器-监听器实战
    • **拦截器的概念和作用**
    • 拦截器实战
    • 监听器概念和作用**
    • 监听器实战

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

拦截器的概念和作用

核心概念说明

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

拦截器与过滤器对比

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

拦截器的执行流程:

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

拦截器实战

创建拦截器步骤

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

登录验证拦截器

@Component@Slf4jpublicclassLoginInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{log.info("=== 进入拦截器 ===");log.info("请求URL: "+request.getRequestURI());log.info("请求方法: "+request.getMethod());// 登录验证逻辑HttpSessionsession=request.getSession();Objectuser=session.getAttribute("user");if(user==null){// 未登录,返回错误信息response.setContentType("application/json;charset=utf-8");PrintWriterwriter=response.getWriter();writer.write("{\"code\": 401, \"message\": \"请先登录\"}");writer.flush();returnfalse;// 中断请求}returntrue;// 继续执行}@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableModelAndViewmodelAndView)throwsException{log.info("=== 控制器执行完成 ===");}@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableExceptionex)throwsException{log.info("=== 请求处理完成 ===");if(ex!=null){log.info("异常信息: "+ex.getMessage());}}}

配置拦截器注册

@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@AutowiredprivateLoginInterceptorloginInterceptor;@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(loginInterceptor).addPathPatterns("/**")// 拦截所有路径.excludePathPatterns(// 排除路径"/user/login","/user/register","/css/**","/js/**","/images/**");}}

测试结果

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应用域属性变化监控配置变化
HttpSessionListenerSession创建和销毁在线用户统计
HttpSessionAttributeListenerSession属性变化用户状态跟踪
ServletRequestListener请求开始和结束请求统计、日志记录

监听器执行时机

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

监听器实战

@ComponentpublicclassSessionListenerimplementsHttpSessionListener{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(SessionListener.class);privatestaticfinalAtomicIntegeronlineUserCount=newAtomicInteger(0);/** * Session创建时调用 */@OverridepublicvoidsessionCreated(HttpSessionEventse){intcount=onlineUserCount.incrementAndGet();logger.info("新用户登录,当前在线用户数: {}",count);// 设置Session超时时间(30分钟)se.getSession().setMaxInactiveInterval(30*60);}/** * Session销毁时调用 */@OverridepublicvoidsessionDestroyed(HttpSessionEventse){intcount=onlineUserCount.decrementAndGet();logger.info("用户退出,当前在线用户数: {}",count);}/** * 获取当前在线用户数 */publicstaticintgetOnlineUserCount(){returnonlineUserCount.get();}}
@GetMapping("/hello")publicStringhello(HttpSessionsession){return"在线人数:"+SessionListener.getOnlineUserCount();}

自动注册说明

  • SpringBoot4.0自动扫描@Component注解的监听器;
  • 无需额外配置,自动注册到Servlet容器;
  • 支持同时注册多个监听器,按需执行。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/27 2:23:36

智能内容解锁工具:专业级免费访问付费内容的终极指南

智能内容解锁工具:专业级免费访问付费内容的终极指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息获取日益重要的今天,智能内容解锁工具成为了突破付…

作者头像 李华
网站建设 2026/2/3 2:25:34

Blender与虚幻引擎资产互通完全指南

Blender与虚幻引擎资产互通完全指南 【免费下载链接】io_scene_psk_psa A Blender plugin for importing and exporting Unreal PSK and PSA files 项目地址: https://gitcode.com/gh_mirrors/io/io_scene_psk_psa 工具定位与价值解析 io_scene_psk_psa插件是连接Blend…

作者头像 李华
网站建设 2026/2/2 13:25:40

终极解决方案:Hidden Bar让你的Mac菜单栏告别拥挤烦恼

终极解决方案:Hidden Bar让你的Mac菜单栏告别拥挤烦恼 【免费下载链接】hidden An ultra-light MacOS utility that helps hide menu bar icons 项目地址: https://gitcode.com/gh_mirrors/hi/hidden 还在为Mac菜单栏上密密麻麻的图标感到困扰吗?…

作者头像 李华
网站建设 2026/1/30 14:48:45

Lance存储架构深度解析:从基础设计到湖仓一体的演进之路

Lance存储架构深度解析:从基础设计到湖仓一体的演进之路 【免费下载链接】lance lancedb/lance: 一个基于 Go 的分布式数据库管理系统,用于管理大量结构化数据。适合用于需要存储和管理大量结构化数据的项目,可以实现高性能、高可用性的数据库…

作者头像 李华
网站建设 2026/1/29 16:24:20

KeymouseGo终极指南:免费开源键鼠自动化工具完整教程

KeymouseGo终极指南:免费开源键鼠自动化工具完整教程 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo KeymouseG…

作者头像 李华