Java 如何在执行需要身份验证的http调用时解决循环依赖场景?
我正在从事一个项目,该项目要求我使用会话令牌执行标准HTTP调用。 我正在构建一个自定义HTTP客户端,带有一个自定义验证器,如下所示:Java 如何在执行需要身份验证的http调用时解决循环依赖场景?,java,authentication,design-patterns,circular-dependency,Java,Authentication,Design Patterns,Circular Dependency,我正在从事一个项目,该项目要求我使用会话令牌执行标准HTTP调用。 我正在构建一个自定义HTTP客户端,带有一个自定义验证器,如下所示: Client client = Client.Builder().withConfig().withAuthenticator(Authenticator); 我的验证器是一个接口 public interface Authenticator{ SessionToken getSessionToken(); // so that different au
Client client = Client.Builder().withConfig().withAuthenticator(Authenticator);
我的验证器是一个接口
public interface Authenticator{
SessionToken getSessionToken(); // so that different authentication methods can be supported
}
现在,为了执行一个请求,我需要获取一个会话令牌,我通过调用
authenticator.getSessionToken()
来获取该令牌。但是,身份验证器必须调用后端来获取令牌,它需要一个客户端,从而导致循环依赖。我如何解决这个问题?一种方法是创建一个单独的身份验证客户机,我将其传递给Authenticator实现的构造函数,但包导入仍将显示循环依赖关系。有更好的设计方法吗 最终,客户端
并不真正需要验证器
;它需要一个SessionToken
。实现这一点的一种方法是将with authenticator()
方法替换为with sessiontoken()
。显而易见的实现是该方法直接接受一个SessionToken
;但是您也可以考虑<代码>验证器< /代码>是A,因此可以表示为.
无论哪种方式,如果您用
SessionToken
或Supplier
替换Client
对Authenticator
的依赖关系,您都可以打破循环依赖关系。谢谢您的回答。我将为整个应用程序范围创建一次客户端实例,因此必须刷新会话令牌,这意味着在最坏的情况下为每个请求创建一个新的会话令牌。所以你的第一个方法是不可能的。不过我喜欢供应商的,肯定会试用,但是这个验证器不会是一个功能接口,这里还有其他一些方法:)