Я столкнулся с любопытным поведением java6/8. Я пытаюсь туннелировать через прокси-сервер, для которого требуется базовая аутентификация пользователя. Выполнение этого стандартного java-аутентификатора. Если я попытаюсь получить доступ к URL-адресу https в качестве первого URL-адреса, выдается исключение:Невозможно туннелировать через прокси. Proxy возвращает «HTTP/1.1 407» через https
java.io.IOException: невозможно туннелировать через прокси. Proxy возвращает «HTTP/1.1 407 Proxy Authentication Required»
Но если я сначала получаю URL-адрес http, а затем URL-адрес https, доступ https работает нормально.
Учитывая этот код:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;
public class ProxyPass {
public ProxyPass(String proxyHost, int proxyPort, final String userid, final String password, String url) {
try {
/* Create a HttpURLConnection Object and set the properties */
URL u = new URL(url);
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
HttpURLConnection uc = (HttpURLConnection) u.openConnection(proxy);
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType().equals(RequestorType.PROXY)) {
return new PasswordAuthentication(userid, password.toCharArray());
}
return super.getPasswordAuthentication();
}
});
uc.connect();
/* Print the content of the url to the console. */
showContent(uc);
}
catch (IOException e) {
e.printStackTrace();
}
}
private void showContent(HttpURLConnection uc) throws IOException {
InputStream i = uc.getInputStream();
char c;
InputStreamReader isr = new InputStreamReader(i);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
public static void main(String[] args) {
String proxyhost = "proxyHost";
int proxyport = proxyPort;
final String proxylogin = proxyUser;
final String proxypass = proxyPass;
String url = "http://www.google.de";
String surl = "https://www.google.de";
// new ProxyPass(proxyhost, proxyport, proxylogin, proxypass, url); // uncomment this line to see that the https request works!
// System.out.println(url + " ...ok"); // uncomment this line to see that the https request works!
new ProxyPass(proxyhost, proxyport, proxylogin, proxypass, surl);
System.out.println(surl + " ...ok");
}
Любые предложения, идеи?
Итак, вы должны сделать это после каждого обновления JDK? – mbee