我需要开发一个Java库,它允许通过代理仅为指定主机定向流量。Java在使用自定义ProxySelector时通过代理解析DNS
该库几乎准备就绪并正在运行,但是通过代理解析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),所有工作正常。通信被定向到我的自定义代理选择器,流量通过自定义代理而没有问题。