Spring拦截器(HandlerInterceptor)使用说明
一、拦截器作用
Spring的HandlerInterceptor用于在请求到达Controller前后进行自定义处理,常用于:
- 登录校验
- 权限校验
- 日志记录
- 请求参数/响应体处理
- 其他AOP风格的业务前后处理
二、常见拦截器类型
本系统常用的拦截器有:
- LoginInterceptor:登录状态校验,拦截未登录用户
- AuthInterceptor:权限校验,拦截无权限用户
- RequestResponseLogInterceptor:请求日志拦截,打印请求/响应详细信息
三、拦截器注册方式
拦截器需在Spring配置类中注册,通常实现WebMvcConfigurer接口,在addInterceptors方法中添加:
java
@Configuration
public class AuthConfig implements WebMvcConfigurer {
@Autowired
LoginInterceptor loginInterceptor;
@Autowired
AuthInterceptor authInterceptor;
@Autowired
RequestResponseLogInterceptor requestResponseLogInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 登录拦截器
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/login", "/user/get-salt", ...);
// 权限拦截器
registry.addInterceptor(authInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/login", "/user/get-salt", ...);
// 日志拦截器
registry.addInterceptor(requestResponseLogInterceptor)
.addPathPatterns("/**");
}
}addPathPatterns("/**"):拦截所有请求excludePathPatterns(...):排除不需要拦截的路径(如登录、静态资源、swagger等)
四、自定义拦截器开发与注册流程
- 实现HandlerInterceptor接口
- 实现
preHandle(请求前)、postHandle(请求后)、afterCompletion(请求完成)方法
- 实现
- 加@Component注解
- 让Spring自动扫描为Bean
- 在配置类注册
- 通过@Autowired注入并在
addInterceptors中注册
- 通过@Autowired注入并在
五、注意事项
- 拦截器顺序:注册顺序即执行顺序,先注册的先执行
- 请求体多次读取:如需多次读取body,需用
ContentCachingRequestWrapper包装 - 响应体打印:需配合
ResponseBodyAdvice实现 - 静态资源、swagger等需排除,否则影响访问
- 拦截器只拦截Spring MVC Controller请求,不拦截静态资源和Filter级别请求
六、常见问题
- 拦截器未生效?
- 检查是否注册到配置类,是否加了@Component,路径是否正确
- 拦截器顺序有要求?
- 登录校验应在权限校验前,日志拦截可最前或最后
- 如何只拦截部分接口?
- 用
addPathPatterns和excludePathPatterns灵活配置
- 用