如何配置HTTPClient以对SOCKS代理进行身份validation?

我需要针对SOCKS代理设置代理身份validation。 我发现这篇文章给出的说明似乎与常见的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的function页面说:

使用本机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

HttpClient 3本身不支持SOCKS。 您可以按照其他人的建议在JDK中尝试SOCKS支持。 副作用是您的整个JVM将通过相同的SOCKS代理。

Java 5支持SOCKS中的用户名/密码身份validation(类型2)。 你所要做的就是设置这样的validation器,

 Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password.toCharArray()); } }); 

同样,这可能对您不起作用,因为它会影响JVM中的所有身份validation(HTTP身份validation,代理身份validation)。

您可以提供实现SOCKS协议的自定义套接字工厂,并将其注册为默认的HTTP协议处理程序。 这个解决方案的限制类似于上面的tuergeist的答案 – 它适用于全局,通过HttpClient建立的任何HTTP连接。

如果您发现这是一个问题,请看看这个对应关系 ,其中Oleg建议使用HttpClient 4.0,但也引用了HttpClient 3.x的HostConfiguration类中的可能补丁。

另一个可能的解决方案是我个人最喜欢的解决方案是将一个包装器HTTP代理写入socks代理。

我试过了

 System.setProperty("socksProxyHost", "socks.xyz.com"); System.setProperty("socksProxyPort", "1000"); 

它工作正常。