【问题标题】:How to transparently propagate an HTTP header via a RestTemplate call?如何通过 RestTemplate 调用透明地传播 HTTP 标头?
【发布时间】:2018-04-06 18:26:38
【问题描述】:

我在 Tomcat 服务器上部署了一个 Spring Boot 应用程序,它接收请求并使用 Spring RestTemplate 向其他服务发出一些其他 HTTP REST 请求。

client --> myApplication --> anotherService

在传入的请求中有一个CORRELATION_ID HTTP 标头,用于跟踪请求。 我希望对其他服务的任何请求也具有此标头,以便我可以关联不同服务器上的日志。

如何在不改变现有代码的情况下实现这一点?

是否有任何RestTemplateInterceptor 我可以在启动时设置某个位置,以便它拦截任何传出请求并添加该标头? 或者有什么办法可以在Tomcat服务器中拦截这个事件并传播header?

【问题讨论】:

    标签: spring spring-mvc tomcat spring-boot


    【解决方案1】:

    没有这样的自动处理。

    您可以拦截传入呼叫的​​标头并将其存储在请求上下文中的某个位置(例如,请求范围的 bean)。

    然后您可以使用ClientHttpRequestInterceptor 将其放入每个发出的请求中。用restTemplate.getInterceptors().add(…)添加那个拦截器

    【讨论】:

    • 第一部分仍然可以,但是是否可以避免在代码中实例化新的resttemplate的每个部分中添加拦截器?
    • 嗯,我不这么认为。如果您需要,您仍然有两个简单的选择:使用您自己的 RestTemplate 工厂,或者将 RestTemplate 公开为您在组件中注入的 bean。
    • 我有一个非常相似的问题,唯一的区别是我的传出请求没有被我明确执行。我说的是对身份验证服务器(keycloak)的 oAuth2 身份验证请求。我正在使用 keycloak spring boot 适配器 + spring security。您是否知道 keycloak 适配器是否在“幕后”使用 RestTemplate 来执行该身份验证请求,因为我需要向该请求添加一些额外的标头。同样的策略在这里会奏效吗?谢谢。
    • 我只能推测,我的推测是没有使用全局RestTemplate bean,可能还有其他的钩子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2015-04-10
    • 2023-03-21
    • 2013-05-22
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多