Skip to content

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等)

四、自定义拦截器开发与注册流程

  1. 实现HandlerInterceptor接口
    • 实现preHandle(请求前)、postHandle(请求后)、afterCompletion(请求完成)方法
  2. 加@Component注解
    • 让Spring自动扫描为Bean
  3. 在配置类注册
    • 通过@Autowired注入并在addInterceptors中注册

五、注意事项

  • 拦截器顺序:注册顺序即执行顺序,先注册的先执行
  • 请求体多次读取:如需多次读取body,需用ContentCachingRequestWrapper包装
  • 响应体打印:需配合ResponseBodyAdvice实现
  • 静态资源、swagger等需排除,否则影响访问
  • 拦截器只拦截Spring MVC Controller请求,不拦截静态资源和Filter级别请求

六、常见问题

  • 拦截器未生效?
    • 检查是否注册到配置类,是否加了@Component,路径是否正确
  • 拦截器顺序有要求?
    • 登录校验应在权限校验前,日志拦截可最前或最后
  • 如何只拦截部分接口?
    • addPathPatternsexcludePathPatterns灵活配置

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer