Как исправить java-прокси в кеше PasswordAuthentication - PullRequest
0 голосов
/ 25 января 2019

Я создаю приложение, которое отправляет несколько прокси-запросов параллельно (многопоточно). Я использую вращающийся прокси-сервер: прокси-хост и порт остаются статическими.Тем не менее, я могу изменить имя пользователя, чтобы использовать другой прокси-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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...