如何修复Java代理PasswordAuthentication缓存

时间:2019-01-25 10:18:46

标签: java authentication proxy

我正在创建一个并行发送多个代理请求(多线程)的应用程序,我正在使用旋转代理服务:代理主机和端口保持静态。但是,我可以更改用户名以使用其他代理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);

我提到了这个问题:Reset the Authenticator credentials,但我无法按照该职位的要求进行导入。 import sun.net.www.protocol.http.logging.AuthCacheValue;不起作用:“访问限制:类型'AuthCacheValue'不是API(对必需的库'C:\ Program Files \ Java \ jdk1.8.0_131 \ jre \ lib \ rt.jar'的限制)”

从我读到的内容来看,无论如何我都不应该导入sun。*软件包。如果可能的话,有人可以帮助我确定在Eclipse中导入sun软件包时需要做什么吗? (或无需导入sun软件包即可解决此问题的解决方案)

0 个答案:

没有答案