java - 通过 Apache Camel 调用 NTLMv2 安全端点

标签 java apache-camel httpclient ntlm ntlmv2

我使用的是 Apache Camel 2.19,并且在使用支持 NTLMv1 的camel-http 模块调用我的端点时能够使用 NTLMv1:

from("activemq:{{queue.feedback}}")
    .to("http://localhost:8888/ntlm/secured?authMethodPriority=NTLM 
                 &authMethod=NTLM&authUsername=Zaphod
                 &authPassword=Beeblebrox&authDomain=Minor
                 &authHost=LightCity")

问题是我不知道如何使用 NTLMv2 发出请求。 official documentation指出:

Note: camel-http is based on HttpClient v3.x and as such has only limited support for what is known as NTLMv1, the early version of the NTLM protocol. It does not support NTLMv2 at all. camel-http4 has support for NTLMv2.

当我尝试使用camel-http4时,它什么也没做:

from("activemq:{{queue.feedback}}")
    .to("http4://localhost:8888/ntlm/secured?authMethodPriority=NTLM 
                 &authMethod=NTLM&authUsername=Zaphod
                 &authPassword=Beeblebrox&authDomain=Minor
                 &authHost=LightCity")

看来camel-http4根本不知道NTLM。我试图调查camel-http4 repo on GitHub除了文档之外,我找不到任何与 NTLM 相关的内容。

关于如何在 Camel 2.19 中使用 NTLMv2(其他版本的 Camel 也可能很合适)有什么想法吗?

最佳答案

问题出在camel-http4组件中。默认情况下,它使用InputStreamEntity,它不是 HttpEntity 实体的可重复实现,这意味着一旦您读取了流,它就会关闭并且您无法再次读取它。这会导致 MainClientExec 失败:

if (execCount > 1 && !RequestEntityProxy.isRepeatable(request)) {
    throw new NonRepeatableRequestException("Cannot retry request with a non-repeatable request entity.");
}

这似乎是一个错误,因此解决方法是在发送请求之前将 InputStreamEntity 转换为 ByteArrayEntity(可重复):

@Component
public class NtlmProcessor implements Processor {

    @Override
    public void process(Exchange exchange) throws Exception {
        HttpEntity httpEntity = exchange.getIn().getBody(HttpEntity.class);

        byte[] bytes = EntityUtils.toByteArray(httpEntity);

        ByteArrayEntity byteArrayEntity = new ByteArrayEntity(bytes, ContentType.get(httpEntity));

        exchange.getOut().setBody(byteArrayEntity);
    }
}

关于java - 通过 Apache Camel 调用 NTLMv2 安全端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45082378/

相关文章:

java - RabbitMQ 和 Camel : route interrupted due to "Message dropped on recovery"

java - 不从seda队列消费时如何用Camel释放文件锁?

java - 如何证明camel已经发生了 throttle

angular - Angular 错误处理和日志记录-调用GlobalErrorHandler的handleError

java - 限制 MySQL 请求

java - 如何通过类类型委托(delegate)构造函数的实例化?

c# - 更改 Microsoft.Owin.Testing.TestServer 的 HttpClient 上的超时没有效果

android - 如何在Android中将不安全的HttpClient传递给Volley请求

java - 通过 HTTPS 请求在 Android 中访问 MySQL 数据库数据的最佳方式

java - 二元运算符 '<' 第一个类型 : float second type: Object 的错误操作数类型