2009-06-04 5 views
1

Java에서 HTMLUnit을 사용하여 원격 URL에 연결하고 얻은 웹 페이지에서 일부 정보를 가져옵니다.HTMLUnit을 사용하여 URL에 연결하는 동안 오류 메시지가 발생했습니다.

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) 
:이 오류 메시지가 무엇입니까 프록시 서버에 대한 세부 정보를 제공 한 후

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()); 

:

나는 다음과 같은 코드를 사용하고

이 정보를 제공해 주시겠습니까?

답변

2

당신이, 내가 오류가 라인에 던져되고 있음을 추측하고있는 전체 스택 추적을 넣지 않았지만 :

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

getPage의 호출이 HtmlPage보다는 UnexpectedPage을 반환하기 때문입니다. documentation for UnexpectedPage을 보면 페이지 요청이 text/html이 아닌 Content-type으로 되돌아오고 있기 때문에 htmlunit이 어떻게 처리해야하는지 잘 모릅니다. 디버깅을 켜고 오류를 파악하기 위해 실제로 돌아 오는 것을 확인해야합니다.

0

Rob이 말한 것처럼 HtmlUnit은 HTML 페이지임을 감지 할 수 없습니다.

는 사용자 목록에 샘플을 제공하십시오, 그래서 우리는

1

더 나는 프록시 서버에 NTLM 인증을 할 HtmlUnit과를 사용할 수 아니다 조사 할 수 있습니다. 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에서입니다.

나는 포트와 호스트를 전달하기 위해 다음을 사용했지만 아마도 당신의 방법도 괜찮습니다. HtmlUnit과 2.14로

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

이 솔루션은 HTTP 프록시를 위해 작동하는 것 같다. 웹 클라이언트가 방문하는 일반 웹 사이트로 헤더가 전달됩니까? 나중에 테스트 할 것이지만 이미 테스트를 마친 경우 알려주십시오. – whitenexx

0

이 나를 위해 작동합니다

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