我想转发带有伪客户端RequestInterceptor的请求 header ,但是在RequestInterceptor.apply
内,RequestContextHolder.getRequestAttributes()
是null
,SecurityContextHolder.getContext().getAuthentication()
也是如此(在这里我最终也可以获取 header 的值)。
在升级到Spring-Cloud Brixton之前,这可以正常工作,因为现在将hystrix命令现在可能必须在单独的线程中运行,因为更改为以下参数可以解决此问题:
hystrix.command.default.execution.isolation.strategy: SEMAPHORE
现在,如果不需要,我不太想更改这种默认值,现在是否有另一种推荐的转发 header 的方法?
谢谢
请您参考如下方法:
对于Spring Boot 2 +/Spring Cloud Finchley +,如果只需要安全上下文,则可以设置以下属性:
hystrix.shareSecurityContext=true
并且请求拦截器应该起作用。
对于其他用例或更早的版本(非常感谢 Spring Cloud Sleuth的启发):
您要做的“全部”是实现一个
HystrixConcurrencyStrategy
,该代码在每次线程更改时都会传递信息。在Sleuth中执行类似操作的类是
here。
对于我的具体情况,我会:
Callable
类将wrapCallable
包装在CallableWithAuthentication
中,该类将在构造CallableWithAuthentication
call
方法将首先还原先前保存的Authentication
,然后调用原始操作,然后清除当前的Authentication
等。 一旦
HystrixConcurrencyStrategy
启动,即使使用线程隔离,您的请求拦截器也将再次起作用。
请注意检查项目的其余部分,还有很多其他有趣的工具(例如RxJava)。