我想转发带有伪客户端RequestInterceptor的请求 header ,但是在RequestInterceptor.apply内,RequestContextHolder.getRequestAttributes()nullSecurityContextHolder.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)。


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!