繁体   English   中英

如何为 SOCKS 代理设置 nonProxyHosts?

[英]How to set nonProxyHosts for a SOCKS proxy?

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

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

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

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

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

但这会导致即使是到localhost DB 连接也在使用 SOCKS 代理,这是不可接受的。

这个应该怎么用? 如何从代理连接中排除某些主机?

使用socksNonProxyHosts系统属性; 这是未记录的,但存在于 Oracle JDK 8 到 11 中,也可能存在于其他版本中。

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

TL; 博士

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

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

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

(强调)

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

  • ProxySelector仅适用于您的应用程序使用URLConnection建立连接的情况。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM