Java HttpComponentMessageSender NTLM
今天我试图配置使用Apache的Java HttpComponentMessageSender NTLM,java,spring,apache-httpcomponents,Java,Spring,Apache Httpcomponents,今天我试图配置使用Apache的org.Apache.httpcomponents.httpclient库的HttpComponentsMessageSender。在我使用标准Java类之前(我认为Java.net.HttpUrlMessageSender或类似的东西) 我的HTTP方法需要使用NTLM进行身份验证,并且软件在Linux下运行,因此我不能使用默认的Windows机制进行身份验证,而是必须在Java应用程序内配置身份验证 最初我只是使用java.net.Authenticator的
org.Apache.httpcomponents.httpclient
库的HttpComponentsMessageSender
。在我使用标准Java类之前(我认为Java.net.HttpUrlMessageSender
或类似的东西)
我的HTTP方法需要使用NTLM进行身份验证,并且软件在Linux下运行,因此我不能使用默认的Windows机制进行身份验证,而是必须在Java应用程序内配置身份验证
最初我只是使用java.net.Authenticator
的自定义实现,我使用它设置用户名和密码
用于NTLM访问。但是当我切换到HttpComponentsMessageSender
时,这种方法不再有效。当我试图用HttpComponentsMessageSender
设置自定义HttpClient
配置时,我遇到了各种问题,我想我会在这里记录这些问题
我将发布我自己的答案,但如果有人有更好的解决方案,请随意添加您的解决方案。我通过添加一个自定义构建
HttpClientBuilder
对象解决了这个问题,该对象是我用HttpClientBuilder
构建的。但是,添加此项会导致出现以下异常:
org.apache.http.ProtocolException:内容长度标头已存在
HttpRequestInterceptor
httpcomponents消息发送程序上使用setConnectionTimeout
不再适用于我的自定义HttpClient
对象。相反,我必须将RequestConfig
对象注入HttpClientBuilder
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);
HttpComponentsMessageSender messageSender=新的HttpComponentsMessageSender();
AuthScope AuthScope;
NTC证书;
凭证提供者凭证提供者;
登记处;
请求配置请求配置;
authscope=新的authscope(主机IP、主机端口);
凭证=新的NTCredentials(“用户”,“通过”,空,“域”);
credentialsProvider=new BasicCredentialsProvider();
credentialsProvider.setCredentials(authscope、credentials);
registry=RegistryBuilder.create()
.register(AuthSchemes.NTLM,新的NTLMSchemeFactory())
.build();
HttpRequestInterceptor拦截器
=(请求,上下文)->request.removeHeaders(HTTP.CONTENT\u LEN);
requestConfig=requestConfig.custom()
.setConnectTimeout(3000)
.build();
HttpClient HttpClient
=HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setDefaultAuthSchemeRegistry(注册表)
.setDefaultCredentialsProvider(credentialsProvider)
.addInterceptorFirst(拦截器)
.build();
messageSender.setHttpClient(httpClient);