- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过 SOCKS 代理连接到 Oracle 数据库,因为我无法直接访问 Oracle 服务器。因此,我在端口 4000 上打开代理,并将这些选项添加到我的应用程序中:
-DsocksProxyHost=localhost -DsocksProxyPort=4000
现在,如果我在连接字符串中使用 Oracle 服务器的主机名启动应用程序,则会收到“指定的未知主机”。如果我使用 IP 地址而不是主机名,则连接成功。我猜 java 正在尝试使用本地 DNS 而不是远程 DNS 来解析主机名。如何使用远程 DNS?
最佳答案
在当前的 OpenJDK 实现中,您可以使用不受支持的解决方法来解决此问题。它可能会在未来版本中被删除。 SOCKS 实现确实支持远程 DNS 查找。但是,这只适用于未解析的 InetSocketAddress 对象。不幸的是,URL.openConnection 使用的 NetworkClient 类总是尝试解析 InetSocketAddress,即使使用 SOCKS 时也是如此。您可以使用技巧来阻止本地名称解析。
通过使用 -Djdk.net.hosts.file=some_file 命令行参数,或者尽早从代码中设置属性(第一件事),将(内部)系统属性 jdk.net.hosts.file 设置为文件名在主要)。这必须在执行内部 NameService 类初始值设定项之前完成,否则将无法工作:
System.setProperty("jdk.net.hosts.file", "some_file");
在当前基于 OpenJDK 的 Java 运行时中,这会将域名解析更改为该文件而不是通常的 DNS。缺少条目或不存在的主机文件会导致无法解析的 InetSocketAddress。这正是我们所需要的,因为 SOCKS 实现现在将使用远程 DNS。
但请注意,您的代理服务器的解析将不再起作用,因此您必须指定代理服务器的 IP 地址。您还可以将代理服务器添加到 some_file。您的应用程序中可能需要的其他 DNS 解析也不起作用。
关于Javasocks代理使用本地DNS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44369862/
我是一名优秀的程序员,十分优秀!