spring - Feign Client - 动态授权 header

我有一项服务可以获取带有授权 header 的 http 请求。 在处理请求时,我想使用一个 Feign Client 来查询另一个服务。对其他服务的查询应包含相同的授权 header 。

目前我使用过滤器从传入请求中提取授权 header ,将 header 存储在 ThreadLocal 中。 在构建 Feign Client 时,我使用 RequestInterceptor 从 ThreadLocal 读取授权 header 并将其放入对其他服务的请求中。

这种方法并不理想,因为当我开始使用 RxJava 或 Hystrix 之类的东西时,线程在处理请求时会发生变化,我必须将授权 header ThreadLocal 从一个线程移动到另一个线程。

还有什么其他方法可以解决这个问题? 我正在考虑的一种方法是为每个请求创建一个新的 FeignClient,这样我就不再需要将授权存储在本地线程中。但这是个好主意吗?

最佳答案

我想我找到了解决问题的方法。使用 RequestContextHolder 我可以获得对原始请求的引用(也来自衍生的子线程)并从那里复制 header :

public class AuthForwardInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        template.header(HttpHeaders.AUTHORIZATION, request.getHeader(HttpHeaders.AUTHORIZATION));
    }
}

https://stackoverflow.com/questions/49168320/

相关文章:

vuejs2 - 在 vue.js 中捕获 API 请求中的错误

firebase - Cloud Functions for Firebase 是否遵守实时数据库规

antd - 为选择的多个组件设置默认初始值

scala - 扁平化 future 内部 yield

php - 创建一个函数来注销 WordPress 用户?

apache-kafka - 一对多KStream-KTable连接

git - 使用通配符过滤 git 分支

reactjs - 从 REST API 加载的 react native 图像 URL 未显示

mongodb - 使用 Mongoose 和 SRV 连接字符串将数据插入 MongoDB Atl

css - Flex 布局 - "flex-basis: 1e-09px"是什么意思?