是否可以从java添加记录到dns缓存?或者我必须使用JNI吗?
答案 0 :(得分:2)
是否可以从java添加记录到dns缓存?或者我必须使用JNI吗?
假设您正在讨论Java应用程序使用的DNS缓存,在这两种情况下答案都是否定。
缓存在java.net.InetAddress类中实现;请参考here获取源代码。如您所见,缓存是使用私有静态属性实现的,所涉及的所有类和方法都是私有的或包私有的。简而言之,你可以通过使用讨厌的反射技巧来破坏Java访问规则,唯一可以获得缓存的方法。
由于这是用纯Java实现的,JNI无济于事。
修改强>
不幸的是,上面的链接不再指向OpenJDK代码: - (。
<强>后续强>
回复:这些评论。
Java DNS缓存? - WineSoaked 2010年5月9日3:25
抱歉没有,系统一个。我正在尝试代理某些网站的默认浏览器,我想为那些指向我本地代理的网站添加一个dns记录将是最简单的方法。 - silverbandit91 2010年5月9日5:32
无法直接在Java系统DNS缓存中植入东西。实际上,我甚至不认为Java 使用系统DNS缓存。
但是你有更好的选择:
让您的用户配置他们的浏览器以使用'autoproxy.pac'文件来确定要使用的代理。 IMO,这是最好的选择。
将要选择性代理的主机的条目放入“/ etc / hosts”并配置(使用“/etc/host.conf”)本地解析程序以查看“/ etc / hosts”之前与DNS服务器交谈。不幸的是(比如缓存中毒)这会使用虚假条目“污染”您的DNS,在使用HTTP / HTTPS以外的服务时会导致问题。
最后,您可能应该重新考虑您对用户完全透明地执行此操作的目标:
如果您这样做是为了实施某些公司安全或互联网访问规则,那么人们可以“绕过”您在此级别实施的任何措施。 (你最好防火墙网络并强制使用代理进行外部访问......或类似的东西。)
如果您只是尝试实现有用的服务,则应该使用autoproxy.pac方法,该方法为用户1)提供正在进行的操作的可见性(如果他们要关注),以及2)选项选择进出。
如果您正在尝试做其他事情......
答案 1 :(得分:2)
Java DNS缓存的实现方式应该对代码最为透明。您可以阅读InetAddress的javadoc以了解有关如何配置缓存的更多信息。但由于它是一个JVM范围的透明代理,因此添加缓存条目的最佳方法就是实际发出一个针对您要缓存信息的域的请求。
出于好奇,你的用例是什么?
答案 2 :(得分:1)
为什么不配置java使用代理?
java -DproxySet=true -DproxyHost=proxy -DproxyPort=8080 MyApp
或
System.setProperty("proxyPort","8080");
System.setProperty("proxyHost","proxy");
会这样做。