Сообщение об ошибке при подключении к URL с использованием HTMLUnit - PullRequest
1 голос
/ 04 июня 2009

Я использую HTMLUnit в Java для подключения к удаленному URL и получения некоторой информации из полученной веб-страницы.

Я использую следующий код:

final WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_6_0, "companyproxy.server", 8080);
final DefaultCredentialsProvider scp = new DefaultCredentialsProvider();
scp.addProxyCredentials("username", "password","companyproxy.server",8080);
webClient.setCredentialsProvider(scp);

final URL url = new URL("http://htmlunit.sourceforge.net");
final HtmlPage page = (HtmlPage)webClient.getPage(url);
System.out.println(page.asXml());

После предоставления сведений о прокси-сервере я получаю это сообщение об ошибке:

SEVERE: Credentials cannot be used for NTLM authentication:
org.apache.commons.httpclient.UsernamePasswordCredentials
org.apache.commons.httpclient.auth.InvalidCredentialsException: Credentials cannot be used for NTLM authentication: org.apache.commons.httpclient.UsernamePasswordCredentials
    at org.apache.commons.httpclient.auth.NTLMScheme.authenticate(NTLMScheme.java:332)
    at org.apache.commons.httpclient.HttpMethodDirector.authenticateProxy(HttpMethodDirector.java:320)
    at org.apache.commons.httpclient.HttpMethodDirector.authenticate(HttpMethodDirector.java:232)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346)
    at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:97)
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1477)
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1435)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:327)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:388)
    at com.test.Test.main(Test.java:25)
Jun 5, 2009 9:28:35 AM org.apache.commons.httpclient.HttpMethodDirector processProxyAuthChallenge
INFO: Failure authenticating with NTLM <any realm>@companyproxy.server:8080
Jun 5, 2009 9:28:35 AM com.gargoylesoftware.htmlunit.WebClient printContentIfNecessary
INFO: statusCode=[407] contentType=[text/html]
Jun 5, 2009 9:28:35 AM com.gargoylesoftware.htmlunit.WebClient printContentIfNecessary
INFO: <HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD>

....

Exception in thread "main" com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException:

407 Proxy Authentication Required for http://htmlunit.sourceforge.net/
    at com.gargoylesoftware.htmlunit.WebClient.throwFailingHttpStatusCodeExceptionIfNecessary(WebClient.java:535)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:332)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:388)
    at com.test.Test.main(Test.java:25)

Не могли бы вы предоставить информацию об этом?

Ответы [ 5 ]

5 голосов
/ 06 февраля 2012

У меня была такая же проблема, и я нашел решение в сети. Забудьте setCredentialsProvider () . Используйте это:

String userAndPassword = username + ":" + password;
String userAndPasswordBase64 = Base64.encodeBase64String(userAndPassword.getBytes());
webClient.addRequestHeader("Proxy-Authorization", "Basic "+userAndPasswordBase64);

Этот класс Base64 относится к кодеку Apache Commons .

Я использовал следующее для передачи порта и хоста, но, вероятно, ваш путь тоже подойдет.

webClient.getProxyConfig().setProxyHost(proxyHost);
webClient.getProxyConfig().setProxyPort(proxyPort);
2 голосов
/ 04 июня 2009

Несмотря на то, что вы не добавили полную трассировку стека, я предполагаю, что в строке выдается ошибка:

final HtmlPage page = (HtmlPage)webClient.getPage(url);

Это потому, что вызов getPage возвращает UnexpectedPage, а не HtmlPage. Глядя на документацию для UnexpectedPage , выясняется, что запрос страницы возвращается с Content-type, который не является text / html, поэтому htmlunit не уверен, что с ним делать. Вы должны включить отладку и посмотреть, что на самом деле возвращается, чтобы выяснить ошибку.

1 голос
/ 05 июня 2009

Я не могу использовать HtmlUnit для проверки подлинности NTLM на прокси-сервере. Когда я использовал HttpClient (поверх него построен HtmlUnit) и установил настройку прокси с аутентификацией NTLM. Это сработало. Вот код для того же.

HttpClient client = new HttpClient();
client.getHostConfiguration().setProxy("companyproxy.server", 8080);
List authPrefs = new ArrayList();
authPrefs.add(AuthPolicy.NTLM);

client.getState().setProxyCredentials(
    new AuthScope(null, 8080, null),
    new NTCredentials("username", "pwd", "", "DOMAIN"));

client.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);

GetMethod method = new GetMethod(url);

method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
        new DefaultHttpMethodRetryHandler(3, false));
0 голосов
/ 24 ноября 2014

С HTMLUnit 2.14 это работает для меня:

    DefaultCredentialsProvider cp = (DefaultCredentialsProvider) client.getCredentialsProvider();
    cp.addNTLMCredentials(proxyUser, proxyPassword, proxyHost, proxyPort, null, domain);
0 голосов
/ 05 июня 2009

Как сказал Роб, HtmlUnit не может обнаружить, что это HTML-страница.

Пожалуйста, предоставьте образец в список пользователей, чтобы мы могли провести дальнейшее расследование

...