Мне нужно поговорить с неясным веб-сервером, который требует аутентификации. Если я не предоставляю учетные данные, отображается форма входа в систему. Однако, если я предоставляю незатребованные учетные данные базовой аутентификации, я получаю непосредственно желаемый контент.HTTP-аутентификация с HTTP-компонентами Apache: принудительная отправка вызова
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
Теперь мой вопрос: Как я могу сделать загрузку в Java с помощью Apache HTTP в компоненты?
Вот что я получил до сих пор. (Там же прокси на месте, и я использую -Y on
в wget
, и у меня есть соответствующий 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 отправлять учетные данные?
Отличная идея, спасибо. Рамочное решение также не сработало для меня. Ручное добавление обработанного заголовка. –
Спасибо. У меня была такая же проблема с клиентом Maven HTTP Wagon и решить его, добавив заголовок вручную. –
В настоящее время вы можете просто использовать 'java.util.Base64.getEncoder(). EncodeToString (что-то)', не нужно зависеть от 'import org.apache.commons.codec.binary.Base64;' – eis