java - 如何为 SOCKS 代理设置 nonProxyHosts?

标签 java proxy localhost socks

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

作为oracle docs describe,有名为 http.nonProxyHostsftp.nonProxyHosts 的选项来设置 HTTP 和 FTP 的代理排除,但没有针对 SOCKS 代理的特定设置。

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

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

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

但这会导致连到 localhost 的数据库连接都在使用 SOCKS 代理,这是 Not Acceptable 。

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

最佳答案

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

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

长话短说

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

然而,documentation对于 Java 网络属性意味着这不存在,因此它的使用可能不稳定:

Once a SOCKS proxy is specified in this manner, all TCP connections will be attempted through the proxy.

(强调)

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

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

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

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

关于java - 如何为 SOCKS 代理设置 nonProxyHosts?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25445875/

相关文章:

apache - 在 Elastic beanstalk 上设置 https 代理

java - Jsoup.clean 不添加 html 实体

java - 反转链表

java - Eclipse 在创建 Maven 原型(prototype)项目时不使用最新的快照

c# - 企业代理适用于 C#,但不适用于 Python

通过 Apache-Redirect 代理进行 Node.js Passport 身份验证

php - 如何配置 XAMPP 以从本地主机 php 发送电子邮件

networking - 如何从外部访问我的 PC 上运行的 Java servlet?

jquery - elasticsearch.js 客户端连接被拒绝 : Access-Control-Allow-Origin not recognized?

java - 我可以使用哪些技术来帮助更好地理解离散数学中的概念是如何在编程中使用的?