2010-05-09 72 views
1

是否有可能從java添加記錄到dns緩存?或者我將不得不使用JNI?java add dns緩存記錄

+0

Java DNS緩存? – WineSoaked 2010-05-09 03:25:41

+0

對不起,系統一個。我試圖代理某些網站的默認瀏覽器,我想爲那些指向我本地代理的網站添加一個DNS記錄是最簡單的方法。 – 2010-05-09 05:32:52

回答

2

是否有可能從java添加記錄到dns緩存?或者我將不得不使用JNI?

假設您正在討論Java應用程序使用的DNS緩存,則在這兩種情況下的答案都是No。

緩存在java.net.InetAddress類中實現;請參閱here獲取源代碼。如您所見,緩存是使用私有靜態屬性實現的,所有涉及的類和方法都是私有的或私有的。總之,只有通過使用討厭的反射技巧來顛覆Java訪問規則才能獲得緩存。

由於這是在純Java中實現的,所以JNI不會起作用。 。

編輯

不幸的是,上面不再指向OpenJDK的代碼鏈接:-(

隨訪

回覆:這些評論


Java DNS ca車? - WineSoaked 5月9日'10 3:25


對不起沒有,系統中的一個。我試圖代理某些網站的默認瀏覽器,我想爲那些指向我本地代理的網站添加一個DNS記錄是最簡單的方法。 - silverbandit91 10年5月9日在5:32

沒有辦法直接從Java系統DNS緩存植物的東西。事實上,我甚至不認爲Java 使用系統DNS緩存。

但也有你正在嘗試做的更好的替代品:

  • 讓您的用戶配置他們的瀏覽器使用「autoproxy.pac」文件,以確定要使用的代理服務器。國際海事組織,這是最好的選擇。

  • 將要選擇性代理到主機的條目放入「/ etc/hosts」並配置(使用「/etc/host.conf」)您的本地解析器在通話前查看「/ etc/hosts」到DNS服務器。不幸的是(像緩存中毒一樣)這個「污染」您的DNS與虛假條目,可能會導致使用HTTP/HTTPS以外的服務時出現問題。

最後,你或許應該重新考慮你這樣做完全透明地向你的用戶的目標:

  • 如果你這樣做是爲了實現一些公司的安全或網絡訪問規則,人們可以「路線圍繞「你在這個級別實施的任何措施。 (你最好關閉網絡防火牆並強制使用外部訪問代理......或類似的東西。)

  • 如果你只是想實現一個有用的服務,你應該使用autoproxy。 pac方法,它爲用戶提供1)正在發生的事情的可見性(如果他們關心的話),以及2)選擇加入或退出的選項。

  • 如果你正在嘗試做別的事情......

2

Java的DNS緩存中,應該是透明的大多是在你的代碼的方式來實現。您可以閱讀InetAddress的javadoc以瞭解有關如何配置緩存的更多信息。但是,由於它充當JVM範圍的透明代理,所以添加緩存條目的最佳方式就是實際發出指向要緩存信息的域的請求。

出於好奇,你的用例是什麼?

1

爲什麼不只是配置java使用代理?

java -DproxySet=true -DproxyHost=proxy -DproxyPort=8080 MyApp 

System.setProperty("proxyPort","8080"); 
System.setProperty("proxyHost","proxy"); 

將做到這一點。

+0

對不起。我的問題不清楚。代理是用java編寫的,我需要瀏覽器才能使用它。 – 2010-05-09 15:55:27

+0

你有兩種其他的可能性: 1.配置你的瀏覽器使用你的代理,只是指定你的代理。 2.如果您只是想爲自己的代理使用某些站點,請將這些站點添加到C:\ Windows \ system32 \ etc \ driver \ hosts.conf,並將它們映射到127.0.0.1(localhost) – Daniel 2010-05-09 18:29:22

+0

這應該是對用戶透明。另外,並非所有用戶都有權訪問主機文件。但我想這些可能是我唯一的選擇。 – 2010-05-09 23:05:25