2009-06-04 4 views
1

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

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

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) 

У вас есть информация о поездке?

ответ

2

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

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

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

0

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

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

1

Я не могу использовать 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)); 
5

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

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

Этот класс Base64 находится в диапазоне от Apache Commons Codec.

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

webClient.getProxyConfig().setProxyHost(proxyHost); 
webClient.getProxyConfig().setProxyPort(proxyPort); 
+0

Это решение, кажется, работает для HTTP прокси. Отправляется ли заголовок на обычные веб-сайты, посещаемые веб-клиентом? Я проверю его позже, но если вы уже протестировали его, дайте мне знать. – whitenexx

0

С HtmlUnit 2,14, это работает для меня:

DefaultCredentialsProvider cp = (DefaultCredentialsProvider) client.getCredentialsProvider(); 
    cp.addNTLMCredentials(proxyUser, proxyPassword, proxyHost, proxyPort, null, domain);