我需要针对SOCKS代理设置代理身份验证。 我发现this post提供的说明似乎与常见的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 代理,还是我必须做一些不同的事情?
答案 0 :(得分:6)
Java支持通过首选项进行Socks代理配置:
socksProxyHost
获取SOCKS代理服务器的主机名socksProxyPort
表示端口号,默认值为1080
e.g。
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
答案 1 :(得分:4)
原生HttpClient 3不支持SOCKS。您可以按照其他人的建议尝试JDK中的SOCKS支持。副作用是您的整个JVM将通过相同的SOCKS代理。
Java 5支持SOCKS中的用户名/密码身份验证(类型2)。您所要做的就是设置这样的身份验证器,
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
});
同样,这可能不适合您,因为它会影响JVM中的所有身份验证(HTTP身份验证,代理身份验证)。
答案 2 :(得分:3)
Apache HTTPClient的Features page说:
使用本机Java套接字支持通过SOCKS代理(版本4和5)进行透明连接。
对于“透明”,我猜他们的意思是它可以工作而不需要做任何特别的事情。你在某处有SOCKS代理吗?你能不能试一试看它是否有效?
答案 3 :(得分:3)
您可以提供实现SOCKS协议的自定义套接字工厂,并将其注册为默认的HTTP协议处理程序。此解决方案的限制类似于上面的tuergeist的答案 - 它全局适用于您将通过HttpClient建立的任何HTTP连接。
如果您发现这是一个问题,请查看this correspondence,其中Oleg建议使用HttpClient 4.0,但也引用HttpClient 3.x的HostConfiguration类中的可能补丁。
另一个可能的解决方案是我个人最喜欢的解决方案是将一个包装器HTTP代理写入socks代理。
答案 4 :(得分:1)
我试过
System.setProperty("socksProxyHost", "socks.xyz.com");
System.setProperty("socksProxyPort", "1000");
它工作正常。