Spring Cloud升级后如何在DiscoveryClient中添加setAdditionalFilters
替代实现方案(Spring Cloud新版本)
针对新版本Spring Cloud中DiscoveryClient.DiscoveryClientOptionalArgs被移除/弃用的情况,你可以通过以下两种方式实现给服务发现请求添加JWT请求头的需求:
通用方案:使用ClientHttpRequestInterceptor
这种方式适配所有基于Spring Cloud Commons的服务发现组件,无需依赖Jersey:
- 自定义请求拦截器
实现ClientHttpRequestInterceptor,注入你的jwtAuthRequestDecorator来添加请求头:
import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import java.io.IOException; public class DiscoveryAuthInterceptor implements ClientHttpRequestInterceptor { private final JwtAuthRequestDecorator jwtAuthRequestDecorator; public DiscoveryAuthInterceptor(JwtAuthRequestDecorator jwtAuthRequestDecorator) { this.jwtAuthRequestDecorator = jwtAuthRequestDecorator; } @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { // 将JWT请求头添加到服务发现请求中 request.getHeaders().addAll(jwtAuthRequestDecorator.getHeaders()); return execution.execute(request, body); } }
- 注册拦截器到服务发现的RestTemplate
通过配置类将拦截器注入到服务发现使用的RestTemplate:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.web.client.RestTemplate; @Configuration public class DiscoveryClientConfig { @Bean public ClientHttpRequestInterceptor discoveryAuthInterceptor(JwtAuthRequestDecorator jwtAuthRequestDecorator) { return new DiscoveryAuthInterceptor(jwtAuthRequestDecorator); } @Bean public RestTemplate discoveryClientRestTemplate(ClientHttpRequestInterceptor discoveryAuthInterceptor) { RestTemplate restTemplate = new RestTemplate(); restTemplate.getInterceptors().add(discoveryAuthInterceptor); return restTemplate; } }
Eureka专属方案:复用Jersey ClientFilter(如果你用Eureka)
如果你使用Eureka作为服务发现组件,且已经引入了Jersey依赖,可以通过EurekaClientConfigurer复用你原来的ClientFilterAdapter逻辑:
import com.netflix.discovery.EurekaClientConfigurer; import com.netflix.discovery.shared.transport.jersey.EurekaJerseyClientImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class EurekaClientConfig { @Bean public EurekaClientConfigurer eurekaClientConfigurer(JwtAuthRequestDecorator jwtAuthRequestDecorator) { return builder -> builder.addClientFilter(new ClientFilterAdapter(jwtAuthRequestDecorator)); } }
关键说明
- 确保
JwtAuthRequestDecoratorBean已正确注册,能够生成有效的JWT请求头。 - 通用方案不依赖Jersey,更符合Spring Cloud新版本的设计趋势;Eureka专属方案可以最小化代码改动,适配你已有的Jersey相关代码。
内容的提问来源于stack exchange,提问作者Tarun Rohila
相关产品推荐
相关产品推荐

