Использование Apache HttpComponents для http-запросов с проверкой подлинности NTLM - PullRequest
3 голосов
/ 02 ноября 2011

Быстрый фон.

CFHTTP не поддерживает проверку подлинности Windows NTLM / Authenticate, только базовую проверку подлинности.Мне нужно сделать http-запросы, которые должны будут проходить аутентификацию в NTLM, поэтому я закончил кататься своей собственной версией CFHTTP.

Я нашел Статья Терри Райана , в которой используется версия apache httpclient3.1 выполнить дайджест-проверку подлинности и использовать ее с использованием версии 4.1.2, которая включает в себя функциональность NTLM.

У меня есть функция, которая выполнит запрос get, а затем другие функции для обработки возврата структуры, которая выглядит какНабор результатов cfhttp.Внесенные мной изменения основаны на учебном примере .

public any function httpRequest(url,username,password,domain) {
    var httpClient = createObject("java","org.apache.http.impl.client.DefaultHttpClient");
    var authScope = createObject("java","org.apache.http.auth.AuthScope");
    var httpCredentials = createObject("java","org.apache.http.auth.NTCredentials");
    var httpGet = createObject("java","org.apache.http.client.methods.HttpGet");
    var jURL = createObject("java", "java.net.URL").init(arguments.url);
    var host = jURL.getHost();
    var path = jURL.getPath();
    var httpHostTarget = createObject("java","org.apache.http.HttpHost").init(host,80,"http");
    var localContext = createObject("java","org.apache.http.protocol.BasicHttpContext");
    var httpContent = {};
    var response = '';

    if (len(arguments.username) and len(arguments.password) gt 0){
        httpCredentials.init(arguments.Username, arguments.password, cgi.remote_host,arguments.domain);
        httpClient.getCredentialsProvider().setCredentials(authScope.ANY, httpCredentials);
    }

    if (!Len(path)) path = "/";
    httpGet.init(path);

    response = httpClient.execute(httpHostTarget, httpget, localContext);

    httpContent = convertHttpClientResponseToCFHTTPFormat(response);

    httpClient.getConnectionManager().shutdown();

    return httpContent;
}

Это работало нормально, пока я не изменил функцию для выполнения аутентификации.

К сожалению, сейчас я получаю:

Метод execute не найден.

Либо не существует методов с указанным именем метода и типом аргумента, либоМетод execute перегружен типами аргументов, которые ColdFusion не может надежно расшифровать.ColdFusion обнаружил 2 метода, которые соответствуют предоставленным аргументам.Если это объект Java, и вы убедились, что метод существует, используйте функцию javacast, чтобы уменьшить неоднозначность.

Насколько я могу судить, в HttpClient есть только одна совпадающая функция execute () дляклассы объектов перешли к нему, поэтому я немного растерялся.JavaCast не позволяет вам приводить сложные объекты или супертипы, чтобы это не работало.

Кто-нибудь может подсказать, как я могу заставить это работать?Как я могу уменьшить двусмысленность?

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Глядя на ошибку, она путается между двумя методами execute, которые имеют одинаковое количество параметров. Хотя я не знаю, почему это ...

Во всяком случае, я нашел способ обойти ошибку. Он включает в себя извлечение нужного вам метода из класса и его непосредственный вызов. Если бы ColdFusion был доволен приведением Java-объектов, жизнь могла бы быть проще.

//response = httpClient.execute(httpHostTarget, httpget, localContext);

classes = [httpHostTarget.getClass(), CreateObject('java', 'org.apache.http.HttpRequest').getClass(), CreateObject('java', 'org.apache.http.protocol.HttpContext').getClass()];
method = httpClient.getClass().getMethod('execute', classes);
params = [httpHostTarget, httpget, localContext];
response = method.invoke(httpClient, params);

Может быть другой способ сделать это (вместо того, чтобы читать), но это все, что у меня есть;)

0 голосов
/ 02 ноября 2011

Как вы думаете, вы могли загружать не ту версию .jars?Похоже, вы не используете JavaLoader, как Райан ...

...