Dir*_*irk 2 authentication spring netflix-feign spring-cloud-feign
我有一个服务,它使用授权标头获取 http 请求。在处理请求时,我想使用一个 Feign Client 来查询另一个服务。对其他服务的查询应包含相同的授权标头。
目前我使用过滤器从传入请求中提取授权标头,将标头存储在 ThreadLocal 中。在构建 Feign Client 时,我使用 RequestInterceptor 从 ThreadLocal 读取授权标头并将其放入对其他服务的请求中。
这种方法并不理想,因为当我开始使用 RxJava 或 Hystrix 之类的东西时,处理请求时线程会发生变化,我必须将授权标头 ThreadLocal 从一个线程移动到另一个线程。
有什么其他选择可以解决这个问题?我正在考虑的一种方法是为每个请求创建一个新的 FeignClient,这样我就不再需要将授权存储在本地线程中。但这是个好主意吗?
我想我找到了解决我的问题的方法。使用RequestContextHolderI 可以获得对原始请求的引用(也来自衍生的子线程)并从那里复制标头:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4832 次 |
| 最近记录: |