news 2026/6/12 2:53:54

SpringBoot 实现拦截器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot 实现拦截器

SpringBoot 拦截器基于Spring MVC Interceptor,用于请求前置/后置处理、登录校验、权限控制、日志记录等,下面分基础实现多拦截器常见配置一步步讲解。

一、核心流程

  1. 自定义拦截器类,实现HandlerInterceptor接口
  2. 创建Web 配置类,实现WebMvcConfigurer注册拦截器
  3. 配置拦截路径、放行路径
  4. 测试验证

二、版本环境

SpringBoot 2.x / 3.x 通用写法(SpringBoot3 仅依赖包无变化)

1. 依赖(常规Web项目即可)

<!-- pom.xml --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

三、第一步:自定义拦截器

实现HandlerInterceptor,包含 3 个核心方法:

  • preHandle:控制器执行之前执行,返回true放行,false拦截
  • postHandle:控制器执行后、视图渲染前执行
  • afterCompletion:请求完全结束(视图渲染完毕)后执行,多用于资源释放
importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/** * 自定义登录拦截器 */publicclassLoginInterceptorimplementsHandlerInterceptor{privatestaticfinalLoggerlog=LoggerFactory.getLogger(LoginInterceptor.class);// 控制器执行前@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{log.info("【拦截器】请求进入 preHandle,地址:{}",request.getRequestURI());// 示例:登录校验(从session获取登录用户)Objectuser=request.getSession().getAttribute("loginUser");if(user==null){log.info("【拦截器】未登录,拦截请求");// 重定向到登录页 / 前后端分离则返回JSONresponse.sendRedirect("/login");returnfalse;// 拦截请求}returntrue;// 放行}// 控制器执行后,视图渲染前@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{log.info("【拦截器】执行 postHandle");}// 整个请求完成后(最后执行)@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{log.info("【拦截器】请求结束 afterCompletion");}}

四、第二步:注册拦截器(核心配置)

新建配置类,实现 WebMvcConfigurer,重写addInterceptors方法注册拦截器。

关键配置说明

  • addPathPatterns()要拦截的路径
    • /**拦截所有请求
    • /api/**拦截 api 下所有接口
  • excludePathPatterns()放行路径(登录、静态资源、验证码等)
importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;/** * Web 全局配置类,注册拦截器 */@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newLoginInterceptor())// 1. 拦截所有请求.addPathPatterns("/**")// 2. 放行路径:登录接口、静态资源、首页等.excludePathPatterns("/login").excludePathPatterns("/static/**").excludePathPatterns("/error");// 放行全局异常页}}

注意:不要加 @EnableWebMvc,加了会覆盖 SpringBoot 默认 Web 配置,导致静态资源、日期格式化等失效。


五、第三步:编写测试接口/页面

1. 登录控制器(模拟登录)

importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.servlet.http.HttpSession;@RestControllerpublicclassTestController{// 登录接口(放行)@GetMapping("/login")publicStringlogin(HttpSessionsession){// 模拟登录成功,存入sessionsession.setAttribute("loginUser","admin");return"登录成功";}// 需拦截的接口@GetMapping("/index")publicStringindex(){return"首页内容";}}

六、测试效果

  1. 访问http://localhost:8080/index
    • 未登录 → 被拦截,重定向到/login
  2. 先访问http://localhost:8080/login(登录)
  3. 再次访问/index→ 正常放行,控制台打印拦截器日志

七、进阶用法

1. 多个拦截器(执行顺序)

注册多个拦截器,先注册先执行(preHandle 顺序:注册顺序;afterCompletion 逆序)

@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){// 拦截器1 先执行registry.addInterceptor(newInterceptor1()).addPathPatterns("/**");// 拦截器2 后执行registry.addInterceptor(newInterceptor2()).addPathPatterns("/**");}

2. 前后端分离场景(返回JSON而非重定向)

替换preHandle中未登录逻辑,返回 JSON 提示:

if(user==null){response.setContentType("application/json;charset=utf-8");response.getWriter().write("{\"code\":401,\"msg\":\"请先登录\"}");returnfalse;}

3. 排除静态资源

SpringBoot 默认静态资源目录:/static/public/resources/META-INF/resources
统一放行:

.excludePathPatterns("/static/**","/public/**")

4. 拦截指定 Controller/接口

只拦截/api/user/**下接口:

.addPathPatterns("/api/user/**")

八、常见问题

  1. 拦截器不生效

    • 检查配置类是否加@Configuration
    • 确认没写@EnableWebMvc
    • 路径匹配是否正确(/**/*区别:/*只拦截一级路径)
  2. 404 页面被拦截

    • 手动放行/error路径
  3. 拦截器无法获取 @RequestBody 参数

    • 原因:流只能读取一次,需配合请求体包装器解决。

补充:SpringBoot3 额外说明

SpringBoot3 基于 Spring6,API 完全兼容以上代码,仅部分包路径变化(javax.servletjakarta.servlet):

// SpringBoot3 导入包importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;

其余逻辑、注册方式完全不变。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 2:52:53

15款降AIGC工具实测:千笔AI遥遥领先

如今 AI 写作工具普及&#xff0c;知网、Turnitin 等平台的 AI 检测规则持续收紧&#xff0c;论文 AI 率超标已经成为学生、科研工作者投稿、答辩前的头号障碍。市面上的降 AI 率工具质量参差不齐&#xff0c;降重效果、平台适配性、内容安全性差距极大。我们对 15 款主流中英文…

作者头像 李华
网站建设 2026/6/12 2:50:50

面试官连环问:从滑动窗口到拥塞控制,TCP如何保证可靠传输?一次讲清

从滑动窗口到拥塞控制&#xff1a;TCP可靠传输的底层逻辑与面试应答策略"请解释TCP如何保证可靠传输"——这是后端开发与网络工程师面试中最经典的开放性问题之一。看似基础的问题背后&#xff0c;往往隐藏着面试官对候选人系统化思维能力的考察。本文将采用问题驱动…

作者头像 李华
网站建设 2026/6/12 2:46:52

不止看功耗:Vivado里Report RAM和Control Sets的隐藏用法与优化技巧

Vivado深度优化&#xff1a;解锁RAM利用率与控制集报告的隐藏价值在FPGA设计的世界里&#xff0c;Vivado工具链就像一位沉默的导师&#xff0c;它提供的各种报告往往蕴含着设计优化的金钥匙。大多数工程师熟悉功耗报告&#xff0c;却常常忽略了两个同样强大的诊断工具——RAM利…

作者头像 李华
网站建设 2026/6/12 2:46:51

如何用foobox三分钟打造专业音乐播放器:foobar2000终极美化指南

如何用foobox三分钟打造专业音乐播放器&#xff1a;foobar2000终极美化指南 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 还在为foobar2000单调的默认界面而烦恼吗&#xff1f;想要一个既美观又功能…

作者头像 李华
网站建设 2026/6/12 2:43:52

手把手教你玩转W25N01GV:SPI NAND Flash的页、块与缓冲区操作详解

深入解析W25N01GV&#xff1a;SPI NAND Flash的底层操作与实战技巧在嵌入式存储领域&#xff0c;NAND Flash因其高密度和低成本优势成为大容量存储的首选方案。W25N01GV作为Winbond推出的SPI接口NAND Flash芯片&#xff0c;凭借其1Gb容量和标准SPI接口&#xff0c;在物联网设备…

作者头像 李华
网站建设 2026/6/12 2:41:27

5分钟快速上手:轻松搭建多协议QQ机器人

5分钟快速上手&#xff1a;轻松搭建多协议QQ机器人 【免费下载链接】LuckyLilliaBot 支持 OneBot 11、Satori 和 Milky 协议 项目地址: https://gitcode.com/gh_mirrors/li/LuckyLilliaBot LuckyLilliaBot是一款基于LiteLoaderQQNT的QQ机器人框架&#xff0c;支持OneBot…

作者头像 李华