我需要将 Apache Axis 1.4 连接到使用 NTLM 身份验证来限制对其操作的访问的 Web 服务。 我希望使用 Samba Jcifs 来处理 NTLM 握手。
我找到了
http://hc.apache.org/httpcomponents-client/ntlm.html
这为我提供了有关如何使用 jcifs 连接 HttpClient 4.0 的绝妙指导。
问题是,Axis 想要使用 Http Client 3.0,这两个 api 看起来非常不同。
我可以看到两种可能性
- 为 Axis 编写一个对象,让它插入 HttpClient 4。
- 找出如何将 HttpClient 3.0 与 Samba Jcifs 连接起来。
数字 1. 看起来不平凡,但可能 第 2 点。我在网上找不到任何描述如何做到这一点的鼓舞人心的消息。
我的问题是:有没有人成功地将 samba jcifs 与 HttpClient 3.0 连接起来? 是否有人已经创建了与 HttpClient 4 一起使用的 Axis HttpSender 对象?
有没有我没有考虑过的更好的选择?
最佳答案
终于有了解决办法。
问题
Apache Axis 使用 Apache HTTPClient
,它提供了自己的 NTLM 实现。
但是这个实现是不完整的;只支持原始的LM认证。
我需要连接的系统坚持使用更新的 NTLM 身份验证。
因此,在将 Apache HTTP 客户端与 NTLM 结合使用时,我的 Web 服务无法通过身份验证。
这实际上进入了一个无限循环,因为 HTTPClient
将永远不会停止尝试和失败的身份验证。
解决方案
jcifs 完全支持所有 3 个版本的 NTLM 握手。
我已将 org.apache.commons.httpclient.auth.NTLM
复制并粘贴到我自己的类中(它被声明为“final”以阻止继承)
然后我覆盖了这个方法
public String getType3Message(
String user, String password, String host, String domain,
byte[] nonce) throws AuthenticationException
构建jcifs.ntlmssp.Type3Message
的实例
并使用此对象返回已正确生成 NTML 身份验证的 Type3Message
。
然后我需要创建自己的 org.apache.commons.httpclient.auth.AuthScheme
实例
利用这个新的 NTLM 实现。称呼
org.apache.commons.httpclient.auth.AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, MyNewAuthScheme.class)
启动我的 WS 端点 stub 。
它有效!!!
关于java - 我怎样才能让 jcifs 与 apache axis 很好地配合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/916820/