我需要開發一個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),所有工作正常。通信被定向到我的自定義代理選擇器,流量通過自定義代理而沒有問題。