如何让jcifs与apache轴很好地配合使用

Ben*_*ond 2 java axis2 ntlm

我需要将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并且两个apis看起来非常不同.

我可以看到两种可能性

  1. 为Axis写一个对象,让它插入HttpClient 4.
  2. 弄清楚如何使用Samba Jcifs连接HttpClient 3.0.

数字1.看起来不平凡,但可能是2号.我在网上找不到任何令人鼓舞的消息,描述如何做到这一点.

我的问题是:有没有人成功连接samba jcifs与HttpClient 3.0?有没有人已经创建了一个与HttpClient 4一起使用的Axis HttpSender对象?

还有一些我没有考虑过的更好的选择吗?

Ben*_*ond 7

最后有一个解决方案.

问题

Apache Axis使用Apache HTTPClient,它提供自己的NTLM实现.
但是这种实施是不完整的; 它只支持原始的LM认证.
我需要连接的系统坚持更新的NTLM身份验证.

因此,在将Apache HTTP Client与NTLM一起使用时,我的Web服务无法进行身份验证.

这实际上然后进入无限循环,因为HTTPClient它将永远不会停止尝试并且无法进行身份验证.

解决方案

jcifs完全支持NTLM握手的所有3个版本.
我已经复制并粘贴org.apache.commons.httpclient.auth.NTLM到我自己的类中(为了击败继承,它被声明为'final')

然后我覆盖了这个方法

public String getType3Message(
        String user, String password, String host, String domain,
        byte[] nonce) throws AuthenticationException
Run Code Online (Sandbox Code Playgroud)

构造一个实例jcifs.ntlmssp.Type3Message 并使用该对象返回一个Type3Message正确生成NTML身份验证的对象.

然后我需要创建自己的实例org.apache.commons.httpclient.auth.AuthScheme 来使用这个新的NTLM实现.呼叫 org.apache.commons.httpclient.auth.AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, MyNewAuthScheme.class)

启动我的WS端点存根.

它的工作原理!