如何为SOCKS代理设置非ProxyHosts?

2022-09-02 10:24:17

我想为SOCKS5代理设置列表,即应该使用直接连接的主机名列表。nonProxyHosts

正如oracle文档所描述的那样,有一些选项可以命名并为HTTP和FTP设置代理排除,但没有针对SOCKS代理的特定设置。http.nonProxyHostsftp.nonProxyHosts

我试过了,但这不会影响SOCKS连接。http.nonProxyHosts

SOCKS 代理通过以下方式设置:

System.setProperty("socksProxyHost", "192.168.10.10");
System.setProperty("socksProxyPort", "3128");

但这会导致即使数据库连接也使用SOCKS代理,这是不可接受的。

这应该如何使用?如何从代理连接中排除某些主机?localhost


答案 1

使用系统属性;这是没有记录的,但存在于Oracle JDKs 8到11中,可能还有其他。socksNonProxyHosts

java -DsocksProxyHost=mySocksServer -DsocksProxyPort=8888 -DsocksNonProxyHosts=127.0.0.1 [...]

TL;DR

该属性可在 sun.net.spi.DefaultProxySelector 的源代码中找到(感谢 @rince)socksNonProxyHosts

但是,Java 网络属性的文档暗示这不存在,因此它的使用可能不稳定:

以这种方式指定 SOCKS 代理后,将尝试通过代理进行所有 TCP 连接。

(着重号后加)

您可能能够使用 和/或类,但是:ProxyProxySelector

  • ProxySelector仅当应用程序 用于建立连接时才适用。URLConnection

  • Proxy适用于任意套接字...但前提是您可以将对象作为参数提供给相关的构造函数调用。(您需要逻辑来提供不同的对象,具体取决于您的代码尝试连接到的内容。ProxySocketProxy

此 RFE 有一个错误。该票证建议了另一种解决方法。显然,如果属性为 ,则(在某些平台上)默认代理选择器将遵循在相应系统代理设置中指定的排除主机。java.net.useSystemProxiestrue


答案 2

推荐