我需要设置代理认证对SOCKS代理。 我发现这个职位给出现与普通HTTP代理工作指令。
httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);
HttpState state = new HttpState();
state.setProxyCredentials(new AuthScope("proxyserver.example.com", 8080),
new UsernamePasswordCredentials("username", "password"));
httpclient.setState(state);
将用SOCKS代理的工作,以及或做我必须做一些不同的东西?
该功能页面的Apache的HttpClient说:
通过使用本地Java插座支撑SOCKS代理(版本4和5)透明连接。
随着“透明的”,我想他们的意思,它的作品没有你需要做什么特别的事情。 你有一个SOCKS代理可用的地方吗? 你就不能尝试一下,看看它是否起作用?
Java支持通过喜好Socks代理配置:
-
socksProxyHost
的SOCKS代理服务器的主机名 -
socksProxyPort
的端口号,默认值是1080
如
java -DsocksProxyHost=socks.mydomain.com
( 编辑 )对于你的榜样,如果SOCKS代理在途中配置概述之前:
httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);
Credentials cred = new UsernamePasswordCredentials("username","password");
httpclient.getState().setProxyCredentials(AuthScope.ANY, cred);
您也可以使用这个变体(无HttpClient的):
SocketAddress addr = new
InetSocketAddress("webcache.mydomain.com", 8080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // Type.HTTP for HTTP
因此,在完成前面的例子,我们现在可以添加:
URL url = new URL("http://java.sun.com/");
URConnection conn = url.openConnection(proxy);
HTH
SOCKS没有被HttpClient的3原生支持。 您可以尝试在JDK的SOCKS支持他人的建议。 副作用是,你的整个JVM将通过相同的SOCKS代理。
Java 5的支持SOCKS(类型2)用户名/密码的认证。 所有你需要做的是设置认证这样,
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
});
同样,这可能不适合你,因为它会影响您的JVM(HTTP认证,代理身份验证)的所有验证工作。
你可以提供一个自定义套接字工厂,实现了SOCKS协议,并将其注册为默认的HTTP协议处理程序。 该解决方案具有类似tuergeist的回答上面有一个限制 - 它在全球范围适用,你会通过HttpClient的建立任何HTTP连接。
如果你发现这是一个问题,看看这种对应关系 ,其中奥列格建议使用的HttpClient 4.0,也就是指在HostConfiguration类中可能的补丁的HttpClient 3.x的
另一种可能的解决方案,这是我个人最喜欢的,就是写一个包装HTTP代理SOCKS代理。
我试过了
System.setProperty("socksProxyHost", "socks.xyz.com");
System.setProperty("socksProxyPort", "1000");
和它的正常工作。