今天我尝试配置使用Apache的org.apache.httpcomponents.httpclient库的HttpComponentsMessageSender。在我使用标准Java类之前(我认为是java.net.HttpUrlMessageSender或类似的东西)。
我的HTTP方法需要使用NTLM进行身份验证,而软件是在Linux下运行的,因此我不能使用默认的Windows机制进行身份验证,而必须在Java应用程序中配置身份验证。
最初,我只是使用java.net.Authenticator的一个自定义实现,我用它来设置访问NTLM的用户名和密码。但当我切换到HttpComponentsMessageSender时,这种方法就不再有效了。当我尝试用HttpComponentsMessageSender设置一个自定义的HttpClient配置时,我遇到了各种问题,我想我会在这里记录这些问题。
我将发布我自己的答案,但如果有人有更好的解决方案,请随时添加您的解决方案。
发布于 2016-07-25 22:48:01
我添加了一个自定义的build HttpClient对象来解决这个问题,它是我用HttpClientBuilder构建的。但是,添加此命令会导致出现以下异常:
org.apache.http.ProtocolException: Content-Length标头已存在
我在this answer中找到的解决方案是添加一个HttpRequestInterceptor.
HttpComponentsMessageSender上的setConnectionTimeout不再适用于我的自定义HttpClient对象。取而代之的是,我必须向HttpClientBuilder.
RequestConfig对象,NTCredentials对象需要域名作为参数。早些时候,当我在java.net中使用Authenticator界面时,只需提供用户名和密码就足够了。这是我目前使用的代码:
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);https://stackoverflow.com/questions/38570905
复制相似问题