最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
SpringBoot拦截器使用指南:从入门到精通
时间:2026-05-28 20:00:02 编辑:袖梨 来源:一聚教程网
Spring拦截器作为请求处理的关键组件,能有效实现权限校验等统一操作。本文将详细介绍拦截器实现原理及使用技巧。
拦截器
图书管理系统采用Session校验登录状态的传统方式存在明显缺陷:需要修改每个接口处理逻辑、调整返回结果,并同步改动前端代码。为解决这些问题,Spring提供的拦截器机制能统一拦截请求进行Session校验。
- 需要修改每个接口的处理逻辑
- 需要修改每个接口的返回结果
- 接口定义修改需要同步调整前端代码
拦截器作为Spring框架核心功能,可以在指定方法前后执行预设的业务代码。

拦截器的使用
实现拦截器功能主要分为两个步骤:
- 定义拦截器
- 注册配置拦截器
自定义拦截器
通过实现HandlerInterceptor接口并重写其方法创建LoginInterceptor:
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("LoginInterceptor 目标方法执行前执行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("LoginInterceptor 目标方法执行后执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("LoginInterceptor 视图渲染完毕后执行,最后执行");
}
}
- preHandle():目标方法执行前调用,返回true继续执行后续操作
- postHandle():目标方法执行后调用
- afterCompletion():视图渲染完成后最后执行
注册配置拦截器
通过实现WebMvcConfigurer接口配置拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
;
}
}
启动服务后观察日志输出,可以看到拦截器各方法的执行顺序。

当preHandle返回false时,只会执行该方法:

拦截器详解
拦截器路径
通过addPathPatterns()指定拦截路径,excludePathPatterns()设置排除路径。例如登录校验可排除登录接口:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/login")
;
}
常见拦截路径配置示例如下:

拦截器执行流程
正常调用顺序示意图:

完整执行流程:
- 请求先被拦截器拦截,执行preHandle()方法
- 返回true则继续执行Controller方法
- 方法执行完毕执行postHandle()和afterCompletion()

登录校验实现
改进后的登录拦截器实现:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
UserInfo userInfo = (UserInfo) session.getAttribute(Constants.USER_SESSION_KEY);
if (userInfo==null || userInfo.getId()<=0){
response.setStatus(401);
return false;
}
return true;
}
配置排除静态资源路径:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/login")
.excludePathPatterns("/css/**")
.excludePathPatterns("/js/**")
.excludePathPatterns("/pic/**")
.excludePathPatterns("/**/*.html")
;
}
访问效果对比:


登录后正常访问:

DispatcherServlet源码解析
服务启动日志显示DispatcherServlet控制程序执行流程:

请求处理流程示意图:

初始化过程
DispatcherServlet初始化方法调用链:

初始化Web容器:

初始化日志输出:

初始化SpringMVC容器:

九大组件初始化
- 文件上传解析器MultipartResolver
- 区域解析器LocaleResolver
- 主题解析器ThemeResolver
- 处理器映射器HandlerMappings
- 处理器适配器HandlerAdapter
- 异常处理器解析器HandlerExceptionResolver
- RequestToViewNameTranslator
- 视图解析器ViewResolvers
- FlashMapManager
核心处理流程
doDispatch方法处理请求:
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 方法实现...
}
重点关注三个核心方法:

对应HandlerInterceptor接口:

适配器模式
HandlerAdapter采用适配器模式实现。
模式定义
适配器模式将一个类的接口转换成客户端期望的另一个接口,使不兼容的类能够协同工作。
模式角色
- Target:目标接口
- Adaptee:需要适配的类
- Adapter:适配器类
- Client:客户端
实现示例
Log4j适配器实现:
public class Log4jAdapter implements Slf4jLog{
private Log4j log4j;
public Log4jAdapter(Log4j log4j) {
this.log4j = log4j;
}
@Override
public void log(String message) {
log4j.log4jPrint("我是是适配器, 打印日志为: "+ message);
}
}
运行结果:

优缺点
优点:
- 提高系统灵活性和可扩展性
- 降低耦合度
缺点:
- 增加系统复杂度
- 可能隐藏适配类的功能
应用场景
- 系统需要使用接口不兼容的现有类
- 需要建立可重用类库
- 接口变更需要兼容旧版本
本文详细介绍了Spring拦截器的实现原理、使用方法和底层机制,帮助开发者深入理解并有效应用这一重要组件。掌握这些知识能显著提升系统开发的效率和质量。
相关文章
- 得物优惠券怎么领取 05-28
- 《梦幻西游》2021跑商最快方法详解-高效路线与技巧分享 05-28
- 《梦幻西游》狮驼岭经脉怎么加点-狮驼岭经脉加点指南 05-28
- Take-Two 在财报中公布重制与重塑计划 05-28
- 《血源卡丁车》老兵在坚持11年后宣布停止协助其他玩家 05-28
- 《梦幻西游》跑商帮贡奖励详解-不同等级收益一览 05-28