如何为SOCKS代理设置nonProxyHosts

问题描述 投票:13回答:1

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

正如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代理,这是不可接受的。应该如何使用?如何从代理连接中排除某些主机?

java proxy localhost socks
1个回答
14
投票

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

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

TL; DR

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

但是,Java网络属性的documentation表示不存在,因此其使用可能不稳定:

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

(添加了强调)

您也许可以使用Proxy和/或ProxySelector类,但是:

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

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

有一个bug for this RFE for this。该票证提出了另一种解决方法。显然,如果java.net.useSystemProxies属性为true,则(在某些平台上)默认代理选择器将排除在适当的系统代理设置中指定的排除主机。

© www.soinside.com 2019 - 2024. All rights reserved.