Spring Boot拦截器详解:原理、实现与应用场景

精心整理了最新的面试资料和简历模板,有需要的可以自行获取

点击前往百度网盘获取
点击前往夸克网盘获取


一、拦截器概述

拦截器(Interceptor)是Spring MVC框架中用于对请求进行预处理和后处理的组件,主要作用于Controller层。相较于Filter(过滤器)作用于更底层,拦截器可以获取Spring的上下文信息,更适合处理与业务逻辑相关的请求拦截。

拦截器与过滤器的区别:

  1. 作用层面:Filter属于Servlet规范,Interceptor属于Spring MVC组件
  2. 依赖关系:Interceptor依赖Spring容器,Filter不依赖
  3. 控制粒度:Interceptor可获取Controller对象和方法信息

二、拦截器核心方法

拦截器通过实现HandlerInterceptor接口实现,包含三个核心方法:

java 复制代码
public interface HandlerInterceptor {
    // 请求到达Controller前执行
    default boolean preHandle(HttpServletRequest request, 
                             HttpServletResponse response, 
                             Object handler) throws Exception {}

    // Controller执行后,视图渲染前执行
    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 {}
}

三、实现自定义拦截器

步骤1:创建拦截器类

java 复制代码
@Component
public class AuthInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
                            HttpServletResponse response,
                            Object handler) throws Exception {
        String token = request.getHeader("Authorization");
        if (!validateToken(token)) {
            response.sendError(HttpStatus.UNAUTHORIZED.value());
            return false; // 中断请求
        }
        return true;
    }

    private boolean validateToken(String token) {
        // 实现具体的Token验证逻辑
        return true;
    }
}

步骤2:注册拦截器

创建配置类实现WebMvcConfigurer:

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private AuthInterceptor authInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/api/**") // 拦截路径
                .excludePathPatterns("/api/public/**"); // 排除路径
    }
}

四、典型应用场景

1. 接口权限验证

java 复制代码
@Override
public boolean preHandle(...) {
    if (request.getSession().getAttribute("user") == null) {
        response.sendRedirect("/login");
        return false;
    }
    return true;
}

2. 请求日志记录

java 复制代码
public class LoggingInterceptor implements HandlerInterceptor {
    
    private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);

    @Override
    public boolean preHandle(...) {
        logger.info("Request [{}] from {}", 
                    request.getRequestURI(),
                    request.getRemoteAddr());
        return true;
    }

    @Override
    public void afterCompletion(...) {
        logger.info("Response status: {}", response.getStatus());
    }
}

3. 接口耗时统计

java 复制代码
@Override
public boolean preHandle(...) {
    request.setAttribute("startTime", System.currentTimeMillis());
    return true;
}

@Override
public void afterCompletion(...) {
    long start = (Long) request.getAttribute("startTime");
    logger.info("Request took {} ms", System.currentTimeMillis() - start);
}

五、高级配置技巧

1. 多拦截器执行顺序

java 复制代码
registry.addInterceptor(authInterceptor).order(1);
registry.addInterceptor(loggingInterceptor).order(2);
// 数值越小优先级越高

2. 路径匹配模式

  • /*:匹配单级路径
  • /**:匹配多级路径
  • /admin/**:匹配/admin下的所有路径

3. 排除静态资源

java 复制代码
.excludePathPatterns("/static/**", "/public/**")

六、常见问题解决方案

Q1:拦截器不生效的可能原因

  1. 未添加@Configuration注解
  2. 路径匹配模式错误
  3. 未正确注入拦截器实例

Q2:如何获取Controller方法信息?

java 复制代码
if (handler instanceof HandlerMethod) {
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    Method method = handlerMethod.getMethod();
    // 获取方法上的注解等信息
}

Q3:异步请求的特殊处理

实现AsyncHandlerInterceptor接口处理异步请求

七、性能优化建议

  1. 避免在拦截器中处理复杂业务逻辑
  2. 合理设置拦截路径,减少不必要的拦截
  3. 使用ThreadLocal存储请求上下文信息

相关推荐
Java后端的Ai之路7 分钟前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData36 分钟前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat43 分钟前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰1 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
Flynn Liang1 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞1 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长1 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
掘金者阿豪1 小时前
SQL Server数据迁移完成后,凌晨的数据库告警该怎么查?
前端·后端
鶴哥只手遮天2 小时前
AFSIM 2.9.0 深度解析·进阶卷第 1 章 插件源码精读:16 个 WSF 插件的架构与实现
后端
愚农搬码2 小时前
低代码表单与在线问卷不是一回事:产品定位和技术边界
后端