首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpComponentMessageSender NTLM

HttpComponentMessageSender NTLM
EN

Stack Overflow用户
提问于 2016-07-25 22:48:01
回答 1查看 386关注 0票数 1

今天我尝试配置使用Apache的org.apache.httpcomponents.httpclient库的HttpComponentsMessageSender。在我使用标准Java类之前(我认为是java.net.HttpUrlMessageSender或类似的东西)。

我的HTTP方法需要使用NTLM进行身份验证,而软件是在Linux下运行的,因此我不能使用默认的Windows机制进行身份验证,而必须在Java应用程序中配置身份验证。

最初,我只是使用java.net.Authenticator的一个自定义实现,我用它来设置访问NTLM的用户名和密码。但当我切换到HttpComponentsMessageSender时,这种方法就不再有效了。当我尝试用HttpComponentsMessageSender设置一个自定义的HttpClient配置时,我遇到了各种问题,我想我会在这里记录这些问题。

我将发布我自己的答案,但如果有人有更好的解决方案,请随时添加您的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2016-07-25 22:48:01

我添加了一个自定义的build HttpClient对象来解决这个问题,它是我用HttpClientBuilder构建的。但是,添加此命令会导致出现以下异常:

org.apache.http.ProtocolException: Content-Length标头已存在

我在this answer中找到的解决方案是添加一个HttpRequestInterceptor.

  • Using,HttpComponentsMessageSender上的setConnectionTimeout不再适用于我的自定义HttpClient对象。取而代之的是,我必须向HttpClientBuilder.

  • The注入一个RequestConfig对象,NTCredentials对象需要域名作为参数。早些时候,当我在java.net中使用Authenticator界面时,只需提供用户名和密码就足够了。

这是我目前使用的代码:

代码语言:javascript
复制
HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender ();
AuthScope authscope;
NTCredentials credentials;
CredentialsProvider credentialsProvider;
Registry<AuthSchemeProvider> registry;
RequestConfig requestConfig;

authscope = new AuthScope (HOST_IP, HOST_PORT);

credentials = new NTCredentials ("user", "pass", null, "domain");

credentialsProvider = new BasicCredentialsProvider ();

credentialsProvider.setCredentials (authscope, credentials);

registry = RegistryBuilder.<AuthSchemeProvider>create ()
        .register(AuthSchemes.NTLM, new NTLMSchemeFactory ())
        .build ();

HttpRequestInterceptor interceptor
        = (request, context) -> request.removeHeaders(HTTP.CONTENT_LEN);

requestConfig = RequestConfig.custom ()
                             .setConnectTimeout (3000)
                             .build ();

HttpClient httpClient
    =  HttpClientBuilder.create ()
                        .setDefaultRequestConfig (requestConfig)
                        .setDefaultAuthSchemeRegistry (registry)
                        .setDefaultCredentialsProvider (credentialsProvider)
                        .addInterceptorFirst (interceptor)
                        .build ();

messageSender.setHttpClient (httpClient);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38570905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档