Spring Boot如何配置Interceptor仅拦截特定API而非全部接口
Spring Boot 拦截器仅拦截指定API的实现方案
有两种常用实现方式,可根据业务场景选择:
方案一:注册时配置路径匹配规则(最简单,适合路径固定的场景)
直接在拦截器注册配置类中,通过addPathPatterns指定要拦截的路径,excludePathPatterns指定要排除的路径即可。
以仅拦截/cities/{cityId}、不拦截/cities为例,修改后的配置代码如下:
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Autowired HeaderValidationInterceptor headerValidationInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(headerValidationInterceptor) // 指定仅拦截目标接口 .addPathPatterns("/cities/{cityId}") // 明确排除不需要拦截的接口 .excludePathPatterns("/cities"); } }
方案二:自定义注解标识(更灵活,适合后续扩展场景)
如果后续可能新增多个需要拦截的接口,不想频繁修改路径配置,可通过自定义注解的方式做标识,拦截器中仅对加了指定注解的接口执行校验逻辑。
步骤如下:
- 新增自定义注解
@NeedHeaderCheck
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NeedHeaderCheck { }
- 在需要拦截的接口方法上添加上述注解
@RestController public class MyController { @Autowired private ICityService cityService; @GetMapping(value = "/cities") public List<City> getCities() { List<City> cities = cityService.findAll(); return cities; } // 加注解标识该接口需要被拦截校验 @NeedHeaderCheck @GetMapping(value = "/cities/{cityId}") public City getCityById(@PathVariable("cityId") String cityId) { City city = cityService.findCityById(cityId); // 原代码此处返回值笔误为cities,已修正 return city; } }
- 修改拦截器逻辑,仅对加了注解的接口执行校验
import org.springframework.web.method.HandlerMethod; public class HeaderValidationInterceptor extends HandlerInterceptorAdapter{ private static final Logger logger = Logger.getLogger(HeaderValidationInterceptor.class); public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 判断是否为Controller方法请求 if(handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; NeedHeaderCheck checkAnnotation = handlerMethod.getMethodAnnotation(NeedHeaderCheck.class); // 仅加了目标注解的接口才执行header校验 if(checkAnnotation != null) { validateHeaderParam(request); } } // 原代码此处startTime未定义,已补充为获取当前时间戳 request.setAttribute("startTime", System.currentTimeMillis()); return true; } }
- 拦截器直接注册即可,无需额外配置路径规则
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Autowired HeaderValidationInterceptor headerValidationInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(headerValidationInterceptor); } }
注意事项
你提供的示例代码存在两处小问题可同步修正:
- 拦截器
preHandle方法中startTime未声明定义,可直接用System.currentTimeMillis()获取请求开始时间 - Controller的
getCityById方法返回值笔误写为cities,实际应返回查询到的city对象
内容的提问来源于stack exchange,提问作者Teja
相关产品推荐
相关产品推荐

