如何为SOCKS代理设置nonProxyHosts

问题描述

使用socksNonProxyHosts系统属性;它没有记录,但存在于Oracle JDK 8至11中,也可能存在于其他版本中。

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

TL; DR

属性socksNonProxyHostssun.net.spi.DefaultProxySelector的源代码中找到(感谢@rince)

但是,有关Java网络属性文档暗示此功能不存在,因此其使用可能不稳定:

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

添加了强调)

您也许可以使用Proxyand和/或ProxySelectorclass,但是:

  • ProxySelector仅在您的应用程序用于URLConnection建立连接时适用。

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

此RFE存在一个错误。该票证提出了另一种@R_403_323@。显然,如果该java.net.useSystemProxies属性true,则(在某些平台上)默认代理选择器将考虑在适当的系统代理设置中指定的排除主机。

解决方法

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

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

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

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

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

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

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

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”