将状态信息传递给 HTTP 拦截器的推荐方法是什么?

What is the recommended way to pass state information to an HTTP interceptor?

我正在尝试记录来自我的应用程序的所有 HTTP 出站请求。但是,我需要 HTTP 拦截器才能访问某些 meta-data HTTP 调用。此数据是为应用程序逻辑本身中的每种单独类型的 HTTP 调用手动设置的。现在,到目前为止我发现有两个方法可以将这些数据传递给拦截器:

  1. 在临时 HTTP header 中包含此元数据,在调用被拦截时记录它,删除 header,进行调用
  2. 将数据存储在静态 ThreadLocal 变量中,在拦截器中检索它并清除 ThreadLocal 存储

虽然这两种方法都很好,但我对这两种方法都有一些保留意见。对于第一种方法,改变 HTTP 请求本身似乎是不明智的,因为万一拦截器未被使用 working/not,元数据将被传递到远程服务器。对于第二种方法,ThreadLocal 的使用与堆内存管理问题相关,因为过多的线程可能会耗尽堆 space.

还有其他standard/recommended方法可以解决这个问题吗?如果不是,上述哪种方法更适合解决这个问题陈述?

请尝试spring云zuul。在它的 zuulFilter 中,你可以记录每个请求,然后 re-dispatch 请求到目标。 spring云网关同理

Spring 中的另一种方法是将 bean-scope 的 Bean 设置为“请求”。单例范围 bean 不是 thread-safe,但是,对于请求范围,Bean 仅在单个 HTTP-Request 的上下文中建立,因此。这样的 Bean 在 HTTP 请求开始时被实例化,并且它的状态在该 HTTP 请求的整个持续时间内持续存在。语法是:

@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public HelloMessageGenerator requestScopedBean() {
    return new HelloMessageGenerator();
}

或者,相同代码的更短版本:

@Bean
@RequestScope
public ScopedBeanClass requestScopedBean() {
    return new ScopedBeanClass();
}

现在可以使用 ScopedBeanClass 在单个 HTTP 请求的生命周期中的任何时间以线程安全的方式设置和读取值,之后 Bean 在下一个请求中 cleared/reset (可能来自并发线程)

请求范围是可以使用的 4 个 web-aware 范围之一。其他范围是:会话范围、应用程序范围和 WebSocket 范围 提供了有关这些范围的更多信息 here