发布时间:2026/8/7 11:22:35
第27篇-拦截器与过滤器 【Kotlin Spring Boot 4 从零到架构师】第 27 篇拦截器与过滤器本系列定位零基础入门从 Kotlin 语法一路到 Spring Boot 4 高级架构DDD Modulith适合 Java 开发者转型也适合纯新手系统学习。本篇你将学到Filter过滤器与 Interceptor拦截器的区别HandlerInterceptor的三个生命周期方法OncePerRequestFilter的使用执行顺序与使用场景学完本篇你将能为 mini-shop 添加请求日志、耗时统计、访问控制等横切功能。一、Filter vs Interceptor1.1 执行位置Spring MVC层Servlet容器层客户端请求Filter (doFilter)DispatcherServletInterceptor (preHandle)ControllerInterceptor (postHandle)Interceptor (afterCompletion)响应返回客户端1.2 核心区别维度FilterInterceptor所属Servlet 容器TomcatSpring MVC执行时机DispatcherServlet 前后Controller 前后能否访问 Controller不能能知道要执行哪个 Controller 方法能否访问 Spring Bean需要手动获取可以直接注入使用场景编码、CORS、日志、安全权限校验、日志、性能监控注册方式FilterRegistrationBeanWebMvcConfigurer二、HandlerInterceptor2.1 三个生命周期方法interfaceHandlerInterceptor{// Controller 执行前funpreHandle(request,response,handler):Boolean// Controller 执行后、视图渲染前funpostHandle(request,response,handler,modelAndView)// 请求完成后无论成功失败funafterCompletion(request,response,handler,ex)}方法执行时机返回值典型用途preHandleController 之前true继续false中断权限校验、限流postHandleController 之后void修改 Model、添加 HeaderafterCompletion全部完成后void清理资源、记录日志2.2 实战示例请求日志 耗时统计packagecom.example.minishop.interceptorimportjakarta.servlet.http.HttpServletRequestimportjakarta.servlet.http.HttpServletResponseimportorg.slf4j.LoggerFactoryimportorg.springframework.stereotype.Componentimportorg.springframework.web.servlet.HandlerInterceptorComponentclassRequestLoggingInterceptor:HandlerInterceptor{privatevallogLoggerFactory.getLogger(RequestLoggingInterceptor::class.java)privatevalstartTimeAttributerequestStartTimeoverridefunpreHandle(request:HttpServletRequest,response:HttpServletResponse,handler:Any):Boolean{valstartTimeSystem.currentTimeMillis()request.setAttribute(startTimeAttribute,startTime)log.info(→${request.method}${request.requestURI}from${request.remoteAddr})returntrue// 继续}overridefunafterCompletion(request:HttpServletRequest,response:HttpServletResponse,handler:Any,ex:Exception?){valstartTimerequest.getAttribute(startTimeAttribute)asLongvaldurationSystem.currentTimeMillis()-startTimevalstatusresponse.statusvalexceptionInfoif(ex!null) exception${ex.message}elselog.info(←${request.method}${request.requestURI}$status${duration}ms$exceptionInfo)}}2.3 注册拦截器packagecom.example.minishop.configimportcom.example.minishop.interceptor.RequestLoggingInterceptorimportorg.springframework.context.annotation.Configurationimportorg.springframework.web.servlet.config.annotation.InterceptorRegistryimportorg.springframework.web.servlet.config.annotation.WebMvcConfigurerConfigurationclassWebConfig(privatevalrequestLoggingInterceptor:RequestLoggingInterceptor):WebMvcConfigurer{overridefunaddInterceptors(registry:InterceptorRegistry){registry.addInterceptor(requestLoggingInterceptor).addPathPatterns(/api/**) // 拦截 /api/ 下所有请求 .excludePathPatterns(/api/health) // 排除健康检查端点 } }2.4 实战示例简单权限校验ComponentclassAuthInterceptor(// 拦截器可以注入 Spring BeanprivatevalauthService:AuthService):HandlerInterceptor{overridefunpreHandle(request:HttpServletRequest,response:HttpServletResponse,handler:Any):Boolean{valtokenrequest.getHeader(Authorization)if(token.isNullOrBlank()){response.contentTypeapplication/json;charsetUTF-8response.statusHttpServletResponse.SC_UNAUTHORIZED response.writer.write({code:401,message:未提供认证 Token})returnfalse// 中断请求}valisValidauthService.validateToken(token)if(!isValid){response.contentTypeapplication/json;charsetUTF-8response.statusHttpServletResponse.SC_UNAUTHORIZED response.writer.write({code:401,message:Token 无效或已过期})returnfalse}returntrue// 放行}}注册时指定拦截路径overridefunaddInterceptors(registry:InterceptorRegistry){registry.addInterceptor(authInterceptor).addPathPatterns(/api/**) .excludePathPatterns( /api/auth/login, // 登录接口不拦截 /api/auth/register, // 注册接口不拦截 /api/health, // 健康检查不拦截 /api/products/** // 商品浏览不拦截公开接口 ) }三、Filter3.1 OncePerRequestFilterSpring 提供了OncePerRequestFilter确保每个请求只执行一次避免请求转发时重复执行packagecom.example.minishop.filterimportjakarta.servlet.FilterChainimportjakarta.servlet.http.HttpServletRequestimportjakarta.servlet.http.HttpServletResponseimportorg.slf4j.LoggerFactoryimportorg.springframework.stereotype.Componentimportorg.springframework.web.filter.OncePerRequestFilterComponentclassRequestIdFilter:OncePerRequestFilter(){privatevallogLoggerFactory.getLogger(RequestIdFilter::class.java)overridefundoFilterInternal(request:HttpServletRequest,response:HttpServletResponse,filterChain:FilterChain){// 1. 从请求头获取或生成请求 IDvalrequestIdrequest.getHeader(X-Request-Id)?:generateRequestId()// 2. 设置到响应头中方便客户端排查response.setHeader(X-Request-Id,requestId)// 3. 存入请求属性供后续 Interceptor / Controller 使用request.setAttribute(requestId,requestId)try{// 4. 继续过滤器链filterChain.doFilter(request,response)}finally{log.debug(请求处理完成requestId$requestId)}}privatefungenerateRequestId():String{returnjava.util.UUID.randomUUID().toString().take(8)}}3.2 Filter 的注册Spring Boot 会自动注册带有Component的 Filter。如果需要自定义 URL 匹配ConfigurationclassFilterConfig{BeanfunrequestIdFilterRegistration(filter:RequestIdFilter):FilterRegistrationBeanRequestIdFilter{valregistrationFilterRegistrationBean(filter)registration.addUrlPatterns(/api/*) // 只拦截 /api/ 路径 registration.order 1 // 执行顺序数字越小越先执行 return registration } }四、执行顺序总结响应处理请求处理请求Filter (按order升序)Interceptor.preHandleControllerInterceptor.postHandleInterceptor.afterCompletionFilter (逆序)响应多过滤器场景请求Filter A (order1)Filter B (order2)Interceptor.preHandleControllerInterceptor.postHandleInterceptor.afterCompletionFilter B (逆序)Filter A (逆序)响应五、选择指南需求选择原因CORS 处理Filter在最外层处理不进入 Spring MVC字符编码设置Filter最早的时机设置编码请求日志Interceptor能拿到 Controller 信息耗时统计Interceptor精确到 Controller 执行时间权限/角色校验Interceptor能获取 Handler 信息请求 ID 追踪Filter最外层生成全链路可用限流Filter 或 Interceptor都可以看是否需要 Spring 上下文本篇小结知识点核心内容FilterServlet 层DispatcherServlet 之前/之后InterceptorSpring MVC 层Controller 之前/之后preHandle返回 false 中断请求postHandleController 之后可修改 ModelafterCompletion最终清理无论成功失败OncePerRequestFilter确保每个请求只过滤一次WebMvcConfigurer注册拦截器 配置路径执行顺序Filter → Interceptor → Controller下篇预告第 28 篇CORS 与文件上传前端跨域请求被拦截怎么办商品图片怎么上传到服务器下一篇解决这两个常见的 Web 开发问题。如果本篇内容对你有帮助欢迎点赞收藏有任何疑问欢迎在评论区交流。

相关新闻

2026/8/7 11:17:35

数字电子技术期末高分复习重点及试卷

本人凭借此重点卷面考了95 数字电子技术期末高分复习重点及试卷 一、考试重点题型与考察方向 填空、选择、判断题:考察基本概念、定义、性质,覆盖各章节基础知识点,出题形式灵活。化简题:重点公式化简法、卡诺图化简法&#xff…

2026/8/7 14:07:47

提升OCR识别准确率:node-tesseract参数优化与最佳实践

提升OCR识别准确率:node-tesseract参数优化与最佳实践 【免费下载链接】node-tesseract A simple wrapper for the Tesseract OCR package 项目地址: https://gitcode.com/gh_mirrors/no/node-tesseract node-tesseract是一个简单而强大的Tesseract OCR包装器…

2026/8/7 14:07:47

CentOS7下Docker与数据库服务部署优化指南

1. CentOS7环境下的Docker与数据库服务部署全景指南 在Linux服务器环境部署中,CentOS 7依然是当前企业级应用的主流选择。最近在为客户部署一套新的微服务架构时,我再次验证了"DockerRedisPostgreSQL"这个黄金组合的可靠性。不同于简单的安装教…

2026/8/7 14:07:47

C盘空间不足?12种专业清理方案与优化技巧

1. 为什么C盘总是莫名其妙变红? 每次打开资源管理器看到C盘飘红,血压就跟着飙升。作为系统盘,C盘就像电脑的心脏地带,不仅装着操作系统,还默默承载着各种软件缓存、临时文件、系统更新残留物。我见过太多同事的电脑&am…

2026/8/7 14:07:47

从频率锚定到权能结构:构建稳定可扩展系统架构的工程实践

在探索前沿科技与宇宙物理的交叉领域时,我们常常会遇到一些极具启发性的概念框架。今天,我们将从一个独特的视角切入,探讨如何将抽象的“频率锚定”与“权能结构”理念,转化为一套可供技术实践参考的、稳定且可扩展的系统架构设计…

2026/8/7 14:02:47

3分钟上手DeepFilterNet:免费高效的实时音频降噪解决方案

3分钟上手DeepFilterNet:免费高效的实时音频降噪解决方案 【免费下载链接】DeepFilterNet Noise supression using deep filtering 项目地址: https://gitcode.com/GitHub_Trending/de/DeepFilterNet 你是否经常在视频会议中受到背景噪音的困扰?或…

2026/8/5 3:13:11

如何用免费工具突破游戏窗口限制:SRWE完整使用指南

如何用免费工具突破游戏窗口限制:SRWE完整使用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否遇到过这样的困扰?想为心爱的游戏截图,却发现游戏不支持自定义分辨率…

2026/8/7 0:01:55

CAD图库管理:从文件归档到设计资产管理的效率革命

你肯定遇到过这种情况:打开一个老项目,想找某个特定的图块——比如一个标准的门、一个特定的设备符号,或者一个公司logo。你记得它就在某个DWG文件里,或者曾经从某个同事那里拷来过。于是,你开始在一堆命名混乱的文件夹…

2026/8/7 0:01:55

5分钟掌握Wand-Enhancer:2026年终极WeMod专业版免费解锁指南

5分钟掌握Wand-Enhancer:2026年终极WeMod专业版免费解锁指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand-Enhancer是一款功能强…

2026/8/7 0:01:55

“Quality Control(质量控制)”在软件工程中通常指通过一系列活动确保软件产品符合预定的质量标准和用户需求

“Quality Control(质量控制)”在软件工程中通常指通过一系列活动确保软件产品符合预定的质量标准和用户需求。而“软件测试”是质量控制的关键手段之一,属于QC范畴下的具体实践,其目标是发现缺陷、验证功能正确性、评估软件质量属…

2026/8/7 9:44:18

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/5 19:21:13

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/6 20:45:01

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…