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

Spring Cloud升级后如何在DiscoveryClient中添加setAdditionalFilters

替代实现方案(Spring Cloud新版本)

针对新版本Spring Cloud中DiscoveryClient.DiscoveryClientOptionalArgs被移除/弃用的情况,你可以通过以下两种方式实现给服务发现请求添加JWT请求头的需求:

通用方案:使用ClientHttpRequestInterceptor

这种方式适配所有基于Spring Cloud Commons的服务发现组件,无需依赖Jersey:

  1. 自定义请求拦截器
    实现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);
    }
}
  1. 注册拦截器到服务发现的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));
    }
}

关键说明

  • 确保JwtAuthRequestDecorator Bean已正确注册,能够生成有效的JWT请求头。
  • 通用方案不依赖Jersey,更符合Spring Cloud新版本的设计趋势;Eureka专属方案可以最小化代码改动,适配你已有的Jersey相关代码。

内容的提问来源于stack exchange,提问作者Tarun Rohila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:17:30