Я создаю приложение, которое отправляет несколько прокси-запросов параллельно (многопоточно). Я использую вращающийся прокси-сервер: прокси-хост и порт остаются статическими.Тем не менее, я могу изменить имя пользователя, чтобы использовать другой прокси-IP.Например, если я использую имя пользователя "myuser_1.1.1.1", он отправит запрос с IP 1.1.1.1.Точно так же, если я использую имя пользователя "myuser_2.2.2.2", он отправит запрос с IP 2.2.2.2.
Проблема: Java в первый раз случайным образом выбирает мое прокси-имя пользователя, но использует это имя снова и снова.Мне нужно, чтобы он случайно выбирал имя пользователя при каждом запросе, а не только при первом запросе.
Теперь я хочу отправить эти запросы, выбрав прокси-IP случайным образом, поэтому я сделал следующее для моего getPasswordAuthentication()
метода:
Authenticator a = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType() == RequestorType.PROXY) {
String[] users = new String[] {
"myuser_1.1.1.1",
"myuser_2.2.2.2",
"myuser_3.3.3.3",
//and so on for all my proxy IPs...
};
Random rnd = new Random();
//Generate a random username
String userRandom = users[rnd.nextInt(users.length)];
System.out.println(userRandom);
String prot = getRequestingProtocol().toLowerCase();
String host = System.getProperty(prot + ".proxyHost", "aProxyServer");
//System.out.println(host);
String port = System.getProperty(prot + ".proxyPort", "8080");
String user = System.getProperty(prot + ".proxyUser", userRandom);
//The password is the same for all usernames
String password = System.getProperty(prot + ".proxyPassword", "aPassword");
if (getRequestingHost().equalsIgnoreCase(host)) {
if (Integer.parseInt(port) == getRequestingPort()) {
// Seems to be OK.
return new PasswordAuthentication(user, password.toCharArray());
}
}
}
return null;
}
};
Теперь, чтобы проверить мой код, я создал цикл, который отправляет 50 запросов GET:
Authenticator.setDefault(a);
HttpGet hg;
for(int i = 0; i < 50; i++) {
System.out.println(i);
hg = new HttpGet("http://whatismyip.akamai.com", false);
System.out.println(hg.get());
}
Внутри моего класса HttpGet я установил свой прокси-сервер следующим образом:
Proxy p = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("aProxyServer", 8080));
con = (HttpURLConnection)obj.openConnection(p);
Я ссылался на это: Сброс учетных данных аутентификатора , но я не могу выполнить требуемый импорт в этом сообщении.import sun.net.www.protocol.http.logging.AuthCacheValue;
не работает: «Ограничение доступа: тип« AuthCacheValue »не является API (ограничение для требуемой библиотеки« C: \ Program Files \ Java \ jdk1.8.0_131 \ jre \ lib \ rt.jar ') »
Из того, что я прочитал, я не должен импортировать пакеты sun. * В любом случае.Если возможно, может кто-нибудь помочь мне определить, что мне нужно сделать, чтобы импортировать пакеты Sun в Eclipse?(или исправление решения без необходимости импорта пакетов Sun)