Я хочу использовать прокси с базовой аутентификацией (имя пользователя, пароль) для подключения (и только этого подключения) в Java. Следующий код работает для URL-адресов HTTP (например, http://www.google.com"):
URL url = new URL("http://www.google.com");
HttpURLConnection httpURLConnection = null;
InetSocketAddress proxyLocation = new InetSocketAddress(proxyHost, proxyPort);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyLocation);
httpURLConnection = (HttpURLConnection) url.openConnection(proxy);
// Works for HTTP only! Doesn't work for HTTPS!
String encoded = new sun.misc.BASE64Encoder().encodeBuffer((proxyUserName + ":" + proxyPassword).getBytes()).replace("\r\n", "");
httpURLConnection.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
int data = isr.read();
while(data != -1){
char c = (char) data;
data = isr.read();
System.out.print(c);
}
isr.close();
Код не работает для URL-адресов HTTPS (например, https://www.google.com"), хотя! Я получаю java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.0 407 Proxy Authentication Required"
, когда пытаюсь получить доступ к URL-адресу HTTPS.
Этот код работает для HTTP и HTTPS:
URL url = new URL("https://www.google.com");
HttpURLConnection httpURLConnection = null;
InetSocketAddress proxyLocation = new InetSocketAddress(proxyHost, proxyPort);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyLocation);
httpURLConnection = (HttpURLConnection) url.openConnection(proxy);
// Works for HTTP and HTTPS, but sets a global default!
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(proxyUserName, proxyPassword.toCharArray());
}
});
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
int data = isr.read();
while(data != -1){
char c = (char) data;
data = isr.read();
System.out.print(c);
}
isr.close();
Проблема со вторым кодом заключается в том, что он устанавливает новый по умолчанию Authenticator
, и я не хочу этого делать, потому что этот прокси используется только частью приложения, а другая часть приложения может быть используя другой прокси. Я не хочу устанавливать глобальное значение по умолчанию для всего приложения. Есть ли способ заставить 1-й код работать с HTTPS или использовать Authenticator
без его установки по умолчанию?
Мне нужно использовать java.net.HttpURLConnection
, потому что я переопределяю метод класса, который должен вернуть HttpURLConnection
, поэтому я не могу использовать Apache HttpClient.