如何在 Spring Boot Feign Client 上定义全局静态标头

Posted

技术标签:

【中文标题】如何在 Spring Boot Feign Client 上定义全局静态标头【英文标题】:How to define global static header on Spring Boot Feign Client 【发布时间】:2018-10-31 14:42:34 【问题描述】:

我有一个 Spring Boot 应用程序并想创建一个具有静态定义的标头值的 Feign 客户端(用于身份验证,但不是基本身份验证)。我找到了 @Headers 注释,但它似乎不适用于 Spring Boot 领域。我怀疑这与使用SpringMvcContract有关。

这是我想要工作的代码:

@FeignClient(name = "foo", url = "http://localhost:4444/feign")
@Headers("myHeader:value")
public interface LocalhostClient 

但它不添加标题。

我尝试制作了一个干净的 Spring Boot 应用,并在此处发布到 github:github example

我能够使其工作的唯一方法是将 RequestInterceptor 定义为全局 bean,但我不想这样做,因为它会影响其他客户端。

【问题讨论】:

【参考方案1】:

您也可以通过向各个方法添加标头来实现此目的,如下所示:

@RequestMapping(method = RequestMethod.GET, path = "/resource", headers = "myHeader=value")

Using @Headers with dynamic values in Feign client + Spring Cloud (Brixton RC2) 讨论了使用@RequestHeader 的动态值解决方案。

【讨论】:

【参考方案2】:

您可以在您的 feign 接口上设置一个特定的配置类,并在其中定义一个 RequestInterceptor bean。例如:

@FeignClient(name = "foo", url = "http://localhost:4444/feign", 
configuration = FeignConfiguration.class)
public interface LocalhostClient 


@Configuration
public class FeignConfiguration 

  @Bean
  public RequestInterceptor requestTokenBearerInterceptor() 
    return new RequestInterceptor() 
      @Override
      public void apply(RequestTemplate requestTemplate) 
        // Do what you want to do
      
    ;
  

【讨论】:

谢谢!我对@Configuration 方法的唯一担心是 Feign 需要该注释,并且您必须小心将其排除在组件扫描之外。这对我来说似乎很危险。如果这个类以某种方式被添加到组件扫描中,突然间我们就会向我们所有的假端点发送敏感信息。 +1 虽然因为这在技术上回答了我的具体问题,即使我将使用阿里的建议

以上是关于如何在 Spring Boot Feign Client 上定义全局静态标头的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 Spring Boot 的情况下注入 Feign Client 并调用 REST Endpoint

如何使用 Spring Boot feign 客户端进行 Oauth2 身份验证?

在 Spring Boot 中安排 OAuth + Feign

如何在Ubuntu中安装Spring Boot CLI?

Spring Boot 和 Feign Client 解析 Enum参数

带有 feign 和 hystrix 的 Spring Boot:无法让请求超时工作