VMWare vijava –“用户名或密码不正确”异常的奇怪情况

在我参与的一个项目中,我们使用yavijava (这是vijava的一个分支)库与托管我们的VM的vCenter进行交互。 vCenter通过其Web服务端点公开了各种API,这些端点是通过HTTP调用的。 yavijava库具有必要的钩子,允许开发人员在客户端使用他们选择的HTTP客户端库来处理对vCenter的调用。

在我们的集成中,我们插入了Apache HTTP客户端库 ,以便yavijava调用内部最终使用此HTTP库进行交互。 一切正常,我们能够调用vCenter API。 我主要说的是,因为我们偶尔会不断看到如下异常:

InvalidLogin:由于用户名或密码错误,无法完成登录。

这令人感到困惑,因为我们完全确定用于与vCenter交互的用户名和密码正确。 特别是由于以前的所有调用都进行得很好,因此在我们开始看到这些异常之前。

异常stacktrace没有包含任何更有用的东西,其他任何日志也没有。 因此,剩下的唯一选择就是去查看vCenter(服务器端)事件日志,看看是否能找到一些东西。 幸运的是,我可以访问具有vSphere Client的设置,然后将其用于连接到vCenter。 vSphere Client允许您查看在vCenter上生成的事件日志。

查看日志,显示出一些有趣且有用的东西。 每次,我们在客户端遇到此“用户名或密码错误”异常时,vCenter Server上在INFO级别上就会有一个相应的事件日志,上面写着“用户无法登录,因为用户已经登录”。 该事件日志是一个足够好的提示,可以让您对可能发生的事情有所了解。

根据该提示,我可以形成的理论是,对于传入的(登录)请求,vCenter Server端会注意到该请求上的某些内容,从而给人一种用户已经登录的印象。考虑到我使用Java EE技术的背景,立即想到的明显的事情是,请求被附加了一个“ Cookie”,服务器端使用它来将请求与特定会话相关联。 因为我可以访问发出此登录请求的客户端代码,所以我绝对确定该请求没有任何显式设置的Cookie标头。 这就提出了一个问题,cookie与谁/请求相关联。 如果这不是我们发出的请求的一部分,那么唯一可能发生的地方是HTTP客户端库内。 阅读Apache HTTP客户端库的文档,证实了以下理论:HTTP客户端已自动将(先前生成的)Cookie与请求相关联。

更具体地说,HTTP客户端库使用池连接。 发出请求时,将使用其中一个池化连接(如果有)。 在此特定情况下发生的是,先前的登录将获取连接C1,并且登录将成功。 从vCenter返回的针对该登录请求的响应将在响应标头中包含一个Cookie集。 然后,Apache HTTP客户端库针对使用的连接跟踪此Cookie。 现在,当后续登录请求到达时,如果相同的池连接C1用于此请求,则HTTP客户端库会将针对该连接C1跟踪的Cookie附加到此新请求。 结果,vCenter Server端最终看到传入的登录请求具有与之关联的Cookie,这表明该请求已经存在一个登录会话。 因此,vCenter事件日志中的该INFO消息。 当然,返回的错误信息不多,实际上有点误导,因为它说用户名/密码不正确。

现在我们知道发生了什么,解决方案非常简单。 Apache HTTP客户端库允许您配置Cookie策略管理。 由于在我们的案例中,我们希望处理针对请求的显式设置Cookie,因此我们决定采用可在HTTP客户端上配置的“ ignoreCookies”策略。 可以在HTTP客户端库文档中找到有关此内容的更多信息(请参阅“ Cookie的手动处理”部分)。 进行此更改后,我们将不再看到此异常。

我找不到任何有关此问题的信息。 我能找到的最接近的是该论坛线程https://sourceforge.net/p/vijava/discussion/826592/thread/91550e2a/ 。 它没有一个确定性的解决方案,但似乎确实存在与用户所遇到的问题相同的问题(将近7年!)

翻译自: https://www.javacodegeeks.com/2018/05/vmware-vijava-the-curious-case-of-incorrect-user-name-or-password-exception.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值