1.核心概念
InterceptorRegistry 是 Spring 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 的验证,除了登录和注册接口可以直接访问。