第27篇-拦截器与过滤器

发布时间:2026/11/13 20:46:00

第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/11/12 11:22:45

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

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

2026/11/14 4:32:13

工地太忙根本没时间复习考试?登高架设上岗证怎么办一步到位

工地太忙根本没时间复习考试?登高架设上岗证怎么办一步到位 工地太忙根本没时间复习考试?登高架设上岗证怎么办是很多一线工友的共同烦恼。尤其是在郑州这样的建筑大市,工期紧张、任务繁重,想要抽出时间备考登高架设上岗证,几乎是不可能的事。但你知道吗…

2026/11/14 4:32:13

电工作业宣传短片内容怎么写?网上查询这些重点别漏掉

电工作业宣传短片内容怎么写?网上查询这些重点别漏掉 你是不是也遇到过这样的情况:手上有个电工证,但不知道能不能干啥活?或者正准备考证,但不知道该从哪下手?别急,今天就来聊聊 电工作业宣传短片内容 该怎么写,以及 网上查询…

2026/11/14 4:32:13

电工证刷视频在哪通过率揭秘:证书过期了不知道怎么复审延期

电工证刷视频在哪通过率揭秘:证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期,这事儿在咱们商丘市政公用工程圈里并不少见。我身边就有一个老电工,去年因为没及时处理电工证复审,差点被项目负责人开除。别看这证在手里拿着,要是过了有效期,…

2026/11/14 4:32:13

化工检修电工证要求全知道:外省证书能转吗?电子证书怎么查

化工检修电工证要求全知道:外省证书能转吗?电子证书怎么查 之前考的证在外省能不能转过来?这是不少在焦作工作的建筑工人最关心的问题。尤其是从事化工检修的电工,证书一旦不能跨省使用,不仅影响工作安排,还可能耽误项目进度。别急,本文从…

2026/11/14 4:32:13

南京高级电工证报名怎么考?考前押题帮你稳过

南京高级电工证报名怎么考?考前押题帮你稳过 之前考的证在外省能不能转过来,这事儿不少电工朋友都问过,尤其是像你在周口考的证,想在南京继续干电工,流程复杂不复杂?别急,我来给你讲清楚,顺便告诉你怎么利用【考前押题】提高南京高级电工证报名的通过…

2026/11/14 4:27:13

工地太忙根本没时间复习考试?特种工叉车电子证书怎么考

工地太忙根本没时间复习考试?特种工叉车电子证书怎么考 工地太忙根本没时间复习考试?特种工叉车的电子证书考试流程你可能还不清楚。很多转岗的洛阳从业者,像我一样,白天忙得脚不沾地,晚上还得熬夜复习,但其实只要掌握了正确的报考流程和备考方法,考特…

2026/11/13 22:33:32

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/14 0:06:39

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来 之前考的证在外省能不能转过来?这个问题我太熟悉了,作为一名干了十几年的特种作业证书办理从业者,每年都会遇到不少像你一样在外地考了证,回来却发现无法直接使用的学员。别急,今天我就…

2026/11/14 0:06:39

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,你不是一个人。在信阳浉河区,很多刚进入工地的电工都面临这样的困境:工作强度大,时间碎片化,根本没有系统复习考试的机会。但电工证是上岗的硬门槛,…

2026/11/13 22:32:11

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑