2012-03-21 3 views
5

인증이 필요한 애매한 웹 서버와 통신해야합니다. 자격 증명을 제공하지 않으면 로그인 양식이 표시됩니다. 그러나 원하지 않는 기본 인증 자격 증명을 제공하면 원하는 콘텐츠로 직접 이동합니다.아파치 HTTP 구성 요소를 이용한 HTTP 인증 : 강제 전송 덤프

wget이 직접 지원

# this fails and downloads a form: 
wget https://weird.egg/data.txt --http-user=me --http-password=shhh 

# this works and downloads the document: 
wget https://weird.egg/data.txt --http-user=me --http-password=shhh --auth-no-challenge 

이제 내 질문 : 어떻게 아파치 HTTP 구성 요소를 사용하여 Java에서 다운로드 할 수 있습니까?

여기까지가 있습니다. (이 또한 장소에서 프록시, 난 wget-Y on을 사용하고, 나는 일치 https_proxy 환경 변수가 있습니다.) 그러나

import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.conn.params.ConnRoutePNames; 
import org.apache.http.auth.AuthScope; 
import org.apache.http.auth.UsernamePasswordCredentials; 
import java.net.URI; 

// ... 

DefaultHttpClient hc = new DefaultHttpClient(); 
hc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(proxy_name, proxy_port)); 

URI uri = new URI("https://weird.egg/data.txt"); 

hc..getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthScope.ANY_SCHEME), new UsernamePasswordCredentials("me", "shh")); 

hc.execute(new HttpGet(uri)); // etc 

, 난 단지 로그인 양식 페이지가 아닌 실제 문서와 끝까지. DefaultHttpClient가 원하지 않는 자격 증명을 보내지 않는다고 의심합니다. 그 방법은 wget입니다. Java 프로그램이 자격 증명을 보내도록하는 방법이 있습니까?

답변

10

신경 쓰지 마세요. 나는 어떤 라이브러리 인증 방법을 사용하려고하지 않음으로써 문제를 해결하지만, 단지 요청에 기본 인증 헤더 짐승 - 강제 :

HttpGet get = new HttpGet(uri); 

String basic_auth = new String(Base64.encodeBase64((username + ":" + password).getBytes())); 
get.addHeader("Authorization", "Basic " + basic_auth); 

hc.execute(get); // etc 

을 (이 추가 import org.apache.commons.codec.binary.Base64; 필요하지만 결국 우리가 credential-을 제거 할 수 있습니다 관련 가져 오기.)

+0

좋은 아이디어, 고마워. 프레임 워크 솔루션 또한 나에게 적합하지 않았습니다. 수동으로 헤더를 추가했습니다. –

+0

감사합니다. 나는 Maven HTTP Wagon 클라이언트와 동일한 문제점을 가지고 있으며 헤더를 수동으로 추가하여이를 해결했다. –

+1

요즘에는'java.util.Base64.getEncoder(). encodeToString (something)'을 사용할 수 있습니다.'import org.apache.commons.codec.binary.Base64; '에 의존 할 필요가 없습니다. – eis