您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
Spring 拦截器:你的请求休想逃过我的五指山!
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
Spring 拦截器:你的请求休想逃过我的五指山!
jd****
2025-07-17
IP归属:北京
88浏览
### 拦截器概述 在Spring框架中,拦截器(Interceptor)是一种强大的机制,它允许开发者在请求处理的不同阶段插入自定义逻辑。WebApplicationContext作为Spring Web应用的上下文容器,为拦截器的配置和管理提供了基础支持。 拦截器主要作用于以下场景: 权限验证 日志记录 性能监控 事务管理 通用行为注入等 ### 拦截器与WebApplicationContext的关系 WebApplicationContext是Spring Web应用的IoC容器扩展,它继承自ApplicationContext,并添加了Web应用特有的功能。拦截器通过WebApplicationContext进行注册和管理,成为请求处理管道的一部分。 ``` public interface WebApplicationContext extends ApplicationContext { String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT"; ServletContext getServletContext(); } ``` ### 拦截器类型 #### HandlerInterceptor 最常用的拦截器接口,定义了三个关键方法: ``` public interface HandlerInterceptor { default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } } ``` #### AsyncHandlerInterceptor HandlerInterceptor的扩展,增加了异步处理的支持。 #### WebRequestInterceptor 与HandlerInterceptor类似,但提供了更通用的WebRequest抽象,不依赖于Servlet API。 ### 拦截器配置 #### XML配置方式 ``` <mvc:interceptors> <!-- 拦截所有请求 --> <bean class="com.example.MyInterceptor"/> <!-- 拦截特定路径 --> <mvc:interceptor> <mvc:mapping path="/secure/**"/> <bean class="com.example.SecurityInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` #### Java配置方式 ``` @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoggingInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/static/**"); registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/admin/**"); } } ``` #### 注解方式 ``` @Component public class MyInterceptor implements HandlerInterceptor { // 实现方法 } @Configuration public class InterceptorConfig { @Autowired private MyInterceptor myInterceptor; @Bean public WebMvcConfigurer adapter() { return new WebMvcConfigurer() { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor); } }; } } ``` ### 拦截器执行流程 拦截器在DispatcherServlet的处理流程中扮演重要角色: * preHandle:在处理器执行前调用 返回true继续执行 返回false中断请求处理 * postHandle:在处理器执行后,视图渲染前调用 可修改ModelAndView * afterCompletion:在完整请求完成后调用 适合资源清理  ### 高级拦截器特性 #### 拦截器顺序控制 可以通过order属性控制多个拦截器的执行顺序: ``` registry.addInterceptor(new InterceptorA()).order(1); registry.addInterceptor(new InterceptorB()).order(2); ``` #### 路径匹配模式 支持Ant风格的路径模式: 1. ? 匹配一个字符 2. * 匹配零个或多个字符 3. ** 匹配零个或多个目录 #### 异步请求处理 对于异步请求,afterConcurrentHandlingStarted方法会被调用而不是postHandle和afterCompletion。 ### 拦截器与过滤器的区别 | 特性 | 拦截器(Interceptor) | 过滤器(Filter) | | --- | --- | --- | | 容器依赖 | Spring容器 | Servlet容器 | | 作用范围 | Spring MVC处理的请求 | 所有进入容器的请求 | | 访问对象 | 可以访问Handler和方法信息 | 只能访问ServletRequest/Response | | 执行时机 | 在DispatcherServlet内部执行 | 在DispatcherServlet外部执行 | | 依赖注入 | 支持 | 不支持 | ### 实际应用示例 #### 日志拦截器 ``` public class LoggingInterceptor implements HandlerInterceptor { private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); logger.info("Request URL: {} : Start Time={}", request.getRequestURL(), startTime); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { long startTime = (Long) request.getAttribute("startTime"); long endTime = System.currentTimeMillis(); logger.info("Request URL: {} : End Time={} : Time Taken={}ms", request.getRequestURL(), endTime, (endTime - startTime)); } } ``` #### 认证拦截器 ``` public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); if (session.getAttribute("user") == null) { response.sendRedirect("/login"); return false; } return true; } } ``` ### DEMO实测效果 被拦截  未被拦截 
上一篇:大语言模型在电商定价中的实践
下一篇:LambdaQueryWrapper遇上@Async
jd****
文章数
11
阅读量
4363
作者其他文章
01
Autobots应用探索:实践中的思考与发现
背景背景1:作为一名测试,日常工作中必不可少的几个环节是查看需求文档、编写测试用例、处理线上问题、能力提升等,基于集团的https://xxx.jd.com/工具能一次性帮我们把这些事情都做了;背景2:作为XXX共建项目的成员之一同时也是第一批用户,我用它做了几个测试实践,和大佬们一起探讨交流。实践一,快速搜索需求文档模糊搜索这个场景多数用于我们不清楚自己到底要找的是哪个需求文档了,可能只是大概对
01
Spring AI接入DeepSeek:快速打造微应用
背景随着DeepSeek-R1的官宣开源,DeepSeek迅速成为AI领域的热门话题,吸引了大量开发者和研究者的关注。这一开源举措不仅推动了技术的普及,也促使更多企业和机构加入到开源生态中。例如,国内大厂X度于2月14日宣布将在未来几个月推出文新大模型4.5系列,并计划从闭源转向开源。这些动态无疑加速了大模型技术的发展,也为开发者提供了更多创新的可能性。作为一名技术人,我深知紧跟时代潮流的重要性。
01
哪吒为何能再掀狂潮?——从梁宁“真需求”看爆款密码
引言:现象级爆款的诞生这个假期你看电影了嘛?我看了,评分比较高的电影包括《战火西岐》、《哪吒之魔童闹海》、《唐探1900》为什么要问这个问题呢,春节档的电影票很贵,我是穷人,哈哈;我只打算看一部电影,但是不知道买哪个好,买票很纠结,于是就会去刷评分等等,看评论等等、结果不出所料,幸运之声眷顾到我头上了,我选中了哪吒,看完之后效果也确实不错,巧的是假期也读了梁宁老师的《真需求》一书,如果我把这部电
01
HarmonyOS-安装篇(DevEco Studio)
一、下载可通过官网下载: https://developer.harmonyos.com/cn/develop/devevo-studio二、安装(经过实践了)三、配置nodejs&ohpm配置SDK配置等待(这块还是稍微有点慢,不要焦急)四、应用(demo)HelloWorld工程创建(选择应用模板,继续点击Next即可创建完成)添加设备(此处我添加的是手机虚拟设备)设备命名(我是使用的默认的
jd****
文章数
11
阅读量
4363
作者其他文章
01
Autobots应用探索:实践中的思考与发现
01
Spring AI接入DeepSeek:快速打造微应用
01
哪吒为何能再掀狂潮?——从梁宁“真需求”看爆款密码
01
HarmonyOS-安装篇(DevEco Studio)
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号