You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
  }
}

方案二:自定义注解标识(更灵活,适合后续扩展场景)

如果后续可能新增多个需要拦截的接口,不想频繁修改路径配置,可通过自定义注解的方式做标识,拦截器中仅对加了指定注解的接口执行校验逻辑。
步骤如下:

  1. 新增自定义注解@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 {
}
  1. 在需要拦截的接口方法上添加上述注解
@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;
    }
}
  1. 修改拦截器逻辑,仅对加了注解的接口执行校验
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;
    }
}
  1. 拦截器直接注册即可,无需额外配置路径规则
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:24:01