Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpComponentMessageSender NTLM_Java_Spring_Apache Httpcomponents - Fatal编程技术网

Java HttpComponentMessageSender NTLM

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的

今天我试图配置使用Apache的
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);