我正在寻找支持认证的java socks Proxy客户端类,有什么建议吗?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));
Run Code Online (Sandbox Code Playgroud)
Java 通过注册java.net.Authenticator或通过网络属性中记录的首选项支持 Socks 代理配置:
SOCKS 协议支持设置
SOCKS 用户名和密码通过以下方式获取。首先,如果应用程序注册了一个
java.net.Authenticator默认实例,那么将使用设置为字符串“SOCKS5”的协议进行查询,并将提示设置为字符串“SOCKS authentication”。如果验证器没有返回用户名/密码或者如果没有注册验证器,则系统检查用户首选项“java.net.socks.username”和“java.net.socks.password”。如果这些首选项不存在,则user.name检查系统属性“ ”的用户名。在这种情况下,不提供密码。socksProxyHost
socksProxyPort (default: 1080)
表示SOCKS代理服务器的名称和SOCKS协议层将使用的端口号。如果指定了 socksProxyHost,则所有 TCP 套接字都将使用 SOCKS 代理服务器来建立连接或接受连接。SOCKS 代理服务器可以是 SOCKS v4 或 v5 服务器,它必须允许未经身份验证的连接。
对于客户端代码示例,您可以在 Stack Overflow 上查看此答案。
编辑:根据评论更新答案
JDK 中 SOCKS 支持的副作用是您的整个 JVM 将通过相同的 SOCKS 代理。所以这可能对你不起作用。
这Authenticator会影响 JVM 中的所有身份验证(HTTP 身份验证、代理身份验证)。同样,这可能对您不起作用。
在你的情况下,一个可能的解决方案是使用的HttpClient从HttpComponents(传统的继承者共享HTTP客户端3.X)。查看示例,尤其是通过代理请求和代理身份验证示例。