【发布时间】:2014-09-05 09:44:57
【问题描述】:
我需要开发一个 java 库,它允许通过代理将流量定向到指定的主机。
该库几乎准备就绪并且可以工作,但是通过代理解析 dns 地址存在问题。
简而言之,我扩展了具有以下逻辑的 CustomProxySelector 类:
public class CustomProxySelector extends ProxySelector {
public List<Proxy> select(URI uri) {
if (customProxyDefinedFor(uri)) {
return getCustomProxyFor(uri);
} else {
// use direct connection
}
}
}
如果本地 dns 可以解析作为“uri”参数给出的主机,则一切正常(例如,如果我希望 stackoverflow.com 通过代理,它将起作用,因为我的本地 dns 可以解析 stackoverflow.com)。
当有一个我的本地 dns 不知道的主机时,问题就出现了。例如,代理后面的 dns 知道如何解析像“host1.private.dmz”这样的地址,因为这是仅在代理后面知道的特殊主机(代理在这里实际上充当反向代理)。 JVM 似乎首先尝试将“host1.private.dmz”解析为 ip,当它失败时,它以以下堆栈跟踪结束:
Caused by: java.net.UnknownHostException: host1.private.dmz
at java.net.InetAddress.getAllByName0(InetAddress.java:1259)
at java.net.InetAddress.getAllByName(InetAddress.java:1171)
at java.net.InetAddress.getAllByName(InetAddress.java:1105)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:247)
(...)
由于无法解析 ip,我的自定义 ProxySelector 从未使用过。是否有任何选项可以强制 java 不通过 localdns 而是通过代理解析 ip?
如果我提供 host1.private.dmz 的 IP 地址(例如 10.100.12.13),一切正常。通信被定向到我的自定义代理选择器,流量通过自定义代理毫无问题。
【问题讨论】: