如何配置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");
它工作正常。