2010-05-09 166 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