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