SpringBoot拦截器使用指南:从入门到精通

作者:袖梨 2026-05-28

Spring拦截器作为请求处理的关键组件,能有效实现权限校验等统一操作。本文将详细介绍拦截器实现原理及使用技巧。

拦截器

图书管理系统采用Session校验登录状态的传统方式存在明显缺陷:需要修改每个接口处理逻辑、调整返回结果,并同步改动前端代码。为解决这些问题,Spring提供的拦截器机制能统一拦截请求进行Session校验。

  1. 需要修改每个接口的处理逻辑
  2. 需要修改每个接口的返回结果
  3. 接口定义修改需要同步调整前端代码

拦截器作为Spring框架核心功能,可以在指定方法前后执行预设的业务代码。

SpringBoot中的拦截器使用详解

拦截器的使用

实现拦截器功能主要分为两个步骤:

  1. 定义拦截器
  2. 注册配置拦截器

自定义拦截器

通过实现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 视图渲染完毕后执行,最后执行");
    }
}
  1. preHandle():目标方法执行前调用,返回true继续执行后续操作
  2. postHandle():目标方法执行后调用
  3. afterCompletion():视图渲染完成后最后执行

注册配置拦截器

通过实现WebMvcConfigurer接口配置拦截器:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
        ;
    }
}

启动服务后观察日志输出,可以看到拦截器各方法的执行顺序。

SpringBoot中的拦截器使用详解

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

SpringBoot中的拦截器使用详解

拦截器详解

拦截器路径

通过addPathPatterns()指定拦截路径,excludePathPatterns()设置排除路径。例如登录校验可排除登录接口:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(loginInterceptor)
            .addPathPatterns("/**")
            .excludePathPatterns("/user/login")
    ;
}

常见拦截路径配置示例如下:

SpringBoot中的拦截器使用详解

拦截器执行流程

正常调用顺序示意图:

SpringBoot中的拦截器使用详解

完整执行流程:

  1. 请求先被拦截器拦截,执行preHandle()方法
  2. 返回true则继续执行Controller方法
  3. 方法执行完毕执行postHandle()和afterCompletion()

SpringBoot中的拦截器使用详解

登录校验实现

改进后的登录拦截器实现:

@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")
    ;
}

访问效果对比:

SpringBoot中的拦截器使用详解

SpringBoot中的拦截器使用详解

登录后正常访问:

SpringBoot中的拦截器使用详解

DispatcherServlet源码解析

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

SpringBoot中的拦截器使用详解

请求处理流程示意图:

SpringBoot中的拦截器使用详解

初始化过程

DispatcherServlet初始化方法调用链:

SpringBoot中的拦截器使用详解

初始化Web容器:

SpringBoot中的拦截器使用详解

初始化日志输出:

SpringBoot中的拦截器使用详解

初始化SpringMVC容器:

SpringBoot中的拦截器使用详解

九大组件初始化

  1. 文件上传解析器MultipartResolver
  2. 区域解析器LocaleResolver
  3. 主题解析器ThemeResolver
  4. 处理器映射器HandlerMappings
  5. 处理器适配器HandlerAdapter
  6. 异常处理器解析器HandlerExceptionResolver
  7. RequestToViewNameTranslator
  8. 视图解析器ViewResolvers
  9. FlashMapManager

核心处理流程

doDispatch方法处理请求:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 方法实现...
}

重点关注三个核心方法:

SpringBoot中的拦截器使用详解

对应HandlerInterceptor接口:

SpringBoot中的拦截器使用详解

适配器模式

HandlerAdapter采用适配器模式实现。

模式定义

适配器模式将一个类的接口转换成客户端期望的另一个接口,使不兼容的类能够协同工作。

模式角色

  1. Target:目标接口
  2. Adaptee:需要适配的类
  3. Adapter:适配器类
  4. 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);
    }
}

运行结果:

SpringBoot中的拦截器使用详解

优缺点

优点:

  1. 提高系统灵活性和可扩展性
  2. 降低耦合度

缺点:

  1. 增加系统复杂度
  2. 可能隐藏适配类的功能

应用场景

  1. 系统需要使用接口不兼容的现有类
  2. 需要建立可重用类库
  3. 接口变更需要兼容旧版本

本文详细介绍了Spring拦截器的实现原理、使用方法和底层机制,帮助开发者深入理解并有效应用这一重要组件。掌握这些知识能显著提升系统开发的效率和质量。

相关文章

精彩推荐