拦截器注册InterceptorRegistry 实现讲解

1.核心概念

InterceptorRegistrySpring MVC提供的拦截器注册器,用于配置拦截器的拦截规则。

2.主要方法
java 复制代码
addInterceptor(): 添加拦截器
addPathPatterns(): 指定要拦截的路径
excludePathPatterns(): 指定要排除的路径
路径匹配规则
/api/**: 匹配 /api/ 下的所有路径(包括多级子路径)
/api/*: 只匹配 /api/ 下的一级路径
/api/user/login: 精确匹配某个具体路径
3.完整实现代码
java 复制代码
​
package com.itheima.miniblog.core.interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// 配置拦截器
@Configuration // 添加这个注解,让 Spring 识别这是一个配置类
public class WebMvcConfig implements WebMvcConfigurer {

@Autowired
private AuthInterceptor authInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
    // 注册认证拦截器
    registry.addInterceptor(authInterceptor)  // 添加拦截器
            .addPathPatterns("/api/**")        // 拦截所有 /api/** 路径
            .excludePathPatterns(              // 排除以下路径(不需要登录验证)
                    "/api/user/login",         // 登录接口
                    "/api/user/register"       // 注册接口
            );
}

}
4.详细解释

1. @Configuration 注解

@Configuration

告诉 Spring 这是一个配置类

Spring 会自动扫描并加载这个配置

如果没有这个注解,配置可能不会生效

2. registry.addInterceptor(authInterceptor)

registry.addInterceptor(authInterceptor)

将我们自定义的 AuthInterceptor 注册到 Spring MVC

authInterceptor 通过 @Autowired 自动注入

3. addPathPatterns("/api/")**

.addPathPatterns("/api/**")

指定拦截器要拦截的路径

** 表示匹配任意多级路径

例如会拦截:

/api/user/info

/api/article/list

/api/comment/add

4. excludePathPatterns(...)

.excludePathPatterns(

"/api/user/login",

"/api/user/register"

)

排除不需要登录验证的接口

即使这些路径匹配 /api/**,也不会被拦截

常见的排除路径:

登录接口

注册接口

验证码接口

公开的文章列表等

5.执行流程示例

场景 1:访问登录接口

java 复制代码
请求: POST /api/user/login

↓

匹配 /api/** ✓

↓

在排除列表中 ✓

↓

不执行拦截器,直接放行 ✓

场景 2:访问用户信息接口

请求: GET /api/user/info

↓

匹配 /api/** ✓

↓

不在排除列表中 ✓

↓

执行 AuthInterceptor.preHandle() ✓

↓

检查 Token,验证登录状态

扩展配置示例

如果你需要更复杂的配置,可以这样写:

java 复制代码
@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(authInterceptor)

.addPathPatterns("/api/**")

.excludePathPatterns(

"/api/user/login", // 登录

"/api/user/register", // 注册

"/api/user/captcha", // 验证码

"/api/article/list", // 公开的文章列表

"/api/article/detail/**" // 公开的文章详情

)

.order(1); // 设置拦截器执行顺序(数字越小越先执行)

}
6.常见问题

Q1: 为什么配置了拦截器但不生效?

java 复制代码
检查是否添加了 @Configuration 注解

检查 AuthInterceptor 是否添加了 @Component 注解

检查路径是否正确匹配

Q2: 如何拦截多个不同的路径?

java 复制代码
.addPathPatterns("/api/**", "/admin/**", "/user/**")

Q3: 如何排除某个目录下的所有接口?

java 复制代码
.excludePathPatterns("/api/public/**") // 排除所有 /api/public/ 下的接口

这样配置后,所有访问 /api/** 的请求都会经过 AuthInterceptor 的验证,除了登录和注册接口可以直接访问。

相关推荐
逍遥德2 小时前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt
云烟成雨TD2 小时前
Spring AI 1.x 系列【54】Retry 机制分析
java·人工智能·spring
weixin_523185322 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
点燃大海2 小时前
SpringAI构建智能体
java·spring boot·spring·springai智能体
xier_ran2 小时前
【infra之路】02_RadixAttention与KV_Cache管理
java·spring boot·spring
黑马师兄2 小时前
RAG混合检索深度解析:让AI真正找到你要的内容
java·人工智能·ai·agent·rag·ai-native
码客日记2 小时前
Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
java·spring boot·git
凡人叶枫3 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
极客先躯3 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
NE_STOP3 小时前
Raft算法处理细节
java