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

如何在Spring Boot Feign中配置请求拦截器注入关联令牌头

解决方案

在Spring Cloud OpenFeign的自动配置场景下,不需要手动使用Feign.builder,通过以下两种方式就能让你的CorrelationTokenInterceptor生效,同时把硬编码的令牌值替换成MDC上下文的内容:

1. 先完善拦截器逻辑

首先修改拦截器,从MDC中获取关联令牌(假设MDC中存储的键是X-CorrelationToken,如果实际键不同请替换):

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.slf4j.MDC;

public class CorrelationTokenInterceptor implements RequestInterceptor {
    @Override 
    public void apply(RequestTemplate template) {
        // 从MDC获取关联令牌,不存在时可设为空或默认值
        String correlationToken = MDC.get("X-CorrelationToken");
        if (correlationToken != null) {
            template.header("X-CorrelationToken", correlationToken);
        }
    }
}

2. 方式一:全局生效(所有Feign客户端自动使用)

直接把拦截器注册为Spring的Bean即可,Spring Cloud OpenFeign会自动把所有RequestInterceptor类型的Bean应用到所有Feign客户端:

方法A:用@Component注解

给拦截器类加上@Component注解:

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;

@Component
public class CorrelationTokenInterceptor implements RequestInterceptor {
    @Override 
    public void apply(RequestTemplate template) {
        String correlationToken = MDC.get("X-CorrelationToken");
        if (correlationToken != null) {
            template.header("X-CorrelationToken", correlationToken);
        }
    }
}

方法B:用配置类注册Bean

如果不想给拦截器加@Component,也可以用配置类注册:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignInterceptorConfig {
    @Bean
    public CorrelationTokenInterceptor correlationTokenInterceptor() {
        return new CorrelationTokenInterceptor();
    }
}

3. 方式二:指定单个/部分Feign客户端生效

如果只想让特定的Feign客户端使用这个拦截器,可以通过以下两种方式:

方法A:通过@FeignClient的configuration属性指定

先创建配置类注册拦截器Bean,再在Feign客户端接口中引用:

// 自定义Feign配置类
@Configuration
public class SomeApiFeignConfig {
    @Bean
    public CorrelationTokenInterceptor correlationTokenInterceptor() {
        return new CorrelationTokenInterceptor();
    }
}

// 修改Feign客户端接口,关联配置类
@FeignClient(value="some-api", url="${client.some-api}", configuration = SomeApiFeignConfig.class)
public interface SomeApi {
    @GetMapping(value = "/someurl", consumes = "application/json")
    String getSomething(@PathVariable("eventId") String eventId);
    // 其他接口...
}

方法B:通过配置文件指定

在YAML配置中,针对特定客户端或全局客户端添加拦截器:

feign:
  client:
    config:
      # 替换成具体客户端名称(比如some-api)则只给该客户端生效,用default表示全局生效
      default:
        connectTimeout: ${FEIGN_CONNECT_TIMEOUT:180000}
        readTimeout: ${FEIGN_READ_TIMEOUT:180000}
        loggerLevel: full
        # 指定拦截器的全类名
        requestInterceptors:
          - com.yourpackage.CorrelationTokenInterceptor

注意事项

  • 你的Spring Cloud OpenFeign版本(2.0.0.RELEASE)完全兼容上述配置方式。
  • 要保证MDC中确实存在对应的关联令牌值,通常需要在请求入口(如Controller层)提前将令牌放入MDC。

内容的提问来源于stack exchange,提问作者John Little

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:12:40