我正在寻找支持认证的java socks代理客户端类,有什么建议吗? java.net.Proxy不支持身份验证。
编辑: 我似乎找不到通过套接字将身份验证数据附加到特定代理主机的方法。 Authenticator.setDefault()仅允许一组凭据。
Authenticator.setDefault(new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication(){
PasswordAuthentication p=new PasswordAuthentication("xxx", "xxx".toCharArray());
return p;
}
});
Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("xxx.xx.xxx.xxx", xxx));
Socket sock = new Socket(proxy);
sock.connect(new InetSocketAddress(server,xx));
答案 0 :(得分:4)
Java通过已注册的java.net.Authenticator
支持Socks代理配置,或通过Networking Properties中记录的首选项支持:
SOCKS协议支持设置
SOCKS用户名和密码是 以下列方式获得。第一, 如果申请已经注册了
java.net.Authenticator
默认 例如,那将被查询 将协议设置为字符串 “SOCKS5”,并提示设置为 字符串“SOCKS身份验证”。如果 验证者不会返回 用户名/密码或如果没有 验证者注册然后 系统检查用户首选项 “java.net.socks.username
”和 “java.net.socks.password
”。如果这些 偏好不存在,那么 系统属性“user.name
”已选中 用户名。在这种情况下,没有 提供密码。<强> socksProxyHost 强>
socksProxyPort (默认值:1080)
指示SOCKS代理服务器的名称以及SOCKS协议层将使用的端口号。如果指定socksProxyHost,则所有TCP套接字将使用SOCKS代理服务器建立连接或接受连接。 SOCKS代理服务器可以是SOCKS v4或v5服务器,它必须允许未经身份验证的连接。
对于客户端代码示例,您可以在Stack Overflow上查看this answer。
编辑:根据评论更新答案
JDK中SOCKS支持的副作用是您的整个JVM将通过相同的SOCKS代理。所以这可能不适合你。
Authenticator
影响JVM中的所有身份验证(HTTP身份验证,代理身份验证)。所以,这可能不适合你。
在您的情况下,可能的解决方案是使用HttpClient中的HttpComponents(遗留Commons HTTP Client 3.x的后继者)。查看samples,尤其是Request via a proxy和Proxy authentication示例。
答案 1 :(得分:0)
使用此HttpClient(非Apache的),
http://www.innovation.ch/java/HTTPClient/
这只是一个URL处理程序,因此您可以使用通常的HTTPUrlConnection。它支持SOCKS和其他代理。