Spring拦截器:你的请求休想逃过我的五指山!
拦截器概述
在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配置方式
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风格的路径模式:
? 匹配一个字符
匹配零个或多个字符
** 匹配零个或多个目录
异步请求处理
对于异步请求,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实测效果
被拦截
未被拦截
- 为什么学校、高校、校园都在使用预付费电能表?原来有这么多好处!
- 国产传感器产业发展破局点或在这里
- 一种碳纤,多种基材,无限惊喜!|易生材料学院公开课
- ADL系列外置互感器导轨式多功能电能表 —— 简介与解决方案
- 进迭时空参加2025 RISC-V北美峰会,披露第二代RISC-V AI CPU芯片 K3 进展
- 融智筑盾 向实链未来 中国联通精彩亮相2025年国家网络安全宣传周
- 华为徐直军:以开创的超节点互联技术,引领AI基础设施新范式
- 国家“东数西算”全面推进,G.654.E光纤应用迎来高潮,长飞在干线集采赢得头筹
- OpenMind 开源全球首个“AI 原生”机器人系统 OM1 Beta,原生支持宇树 G1 / Go2 等产品
- 神州泰岳avavox开启全球菁英生态伙伴计划:让AI人人可用、红利共享
- 2025年中国国际信息通信展前瞻:五大看点勾勒数智未来新图景
- 碳硅共生 合创AI+时代丨信而泰邀您共赴2025中国移动全球合作伙伴大会
- 中国移动发布《云智算光互连发展报告》
- 中兴通讯蝉联中国云终端市场第一
- 拥抱“鲲鹏+�N腾”,持续创新:华鲲振宇闯出国产算力崛起之路
- 汇川技术与安康职业技术学院达成战略合作