我正在使用 CXF 框架(版本:2.7.8)为 SharePoint 2007 编写 SOAP 客户端。我已按照在线文档添加 NTLM 支持 here .我让客户端正常工作并跟踪 HTTP session 显示正在发送 NTLM 凭据,但是,我仍然收到 401 未经授权的响应。
代码:
Lists listService = new Lists();
ListsSoap port = listService.getListsSoap();
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put("use.async.http.conduit", Boolean.TRUE);
Credentials creds = new NTCredentials(USER, PASS, "", DOMAIN);
bp.getRequestContext().put(Credentials.class.getName(), creds);
Client client = ClientProxy.getClient(proxy);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(36000);
httpClientPolicy.setAllowChunking(false);
httpClientPolicy.setAutoRedirect(true);
http.setClient(httpClientPolicy);
// Build request and execute
有趣的是,我使用 Apache HTTPClient 库为 WebDAV 使用 HTTP PUT 编写了一个类似的客户端来上传文档,并且能够使用 NTLM 成功进行身份验证。此外,我能够使用 SOAPUI 调用我正在尝试为其构建 Java 客户端的相同列表 Web 服务,并且它也使用 NTLM 成功进行了身份验证。
我假设 NTLM 的实现在 CXF 和 HTTPClient 之间是不同的。关于我的 CXF 实现有什么问题的任何想法?或者我如何才能让它镜像 HTTPClient 实现?
最佳答案
请试试这个方法!
HTTPConduit http = (HTTPConduit)client.getConduit();
AsyncHTTPConduit conduit = (AsyncHTTPConduit)http;
DefaultHttpAsyncClient defaultHttpAsyncClient;
defaultHttpAsyncClient = conduit.getHttpAsyncClient();
defaultHttpAsyncClient.getCredentialsProvider().setCredentials( AuthScope.ANY,
new NTCredentials( USER,PWD, "", DOM ) );
conduit.getClient().setAllowChunking( false );
conduit.getClient().setAutoRedirect( true );
关于java - 带有 NTLM 的 CXF SOAP 客户端到 SharePoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21739141/