`

java 如何动态修改DNS,对host动态绑定即时生效

 
阅读更多

 

 

1.windows下

  1.1 在java中直接设置:

           java.security.Security.setProperty("networkaddress.cache.ttl" , "0");

        java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");

 

      然后修改host文件的绑定直接就能生效。

 

    1.2 通过反射修改jdk的DNS缓存,在windows下修改host之后也能直接生效。

        

 

 


                 
public static void jdkDnsNoCache() throws SecurityException, NoSuchFieldException, IllegalArgumentException,                  IllegalAccessException{
Class clazz = java.net.InetAddress.class;
                final Field cacheField = clazz.getDeclaredField("addressCache");
                cacheField.setAccessible(true);
                final Object o = cacheField.get(clazz);
                Class clazz2 = o.getClass();
                 final Field cacheMapField = clazz2.getDeclaredField("cache");
                cacheMapField.setAccessible(true);
                final Map cacheMap = (Map)cacheMapField.get(o);
                AccessController.doPrivileged(new PrivilegedAction() {
                    public Object run() {
                        try{
                            synchronized(o){//同步是必须的,因为o可能会有多个线程同时访问修改。
//                                cacheMap.clear();//这步比较关键,用于清除原来的缓存
                                    cacheMap.remove("www.baidu.com");
                            }   
                        }catch(Throwable te){
                            throw new RuntimeException(te);
                        }   
                        return null;
                    }   
                }); 
                
        }     

    2.linux下:

      2.1除了在java中设置      

        java.security.Security.setProperty("networkaddress.cache.ttl" , "0");

        java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");

      还需要启动一个脚本:执行这个脚本才能修改host文件后直接生效。 脚本执行间隔根据需求定。

        #!/bin/sh

  while [ true ]
  do
  /etc/init.d/nscd restart
  done

    这个脚本也可以使用java 的runtime来执行。

    public static String getTestUrlHtml(String url, String host, String ip) throws IOException{

                java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
                java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
                Process processTest = Runtime.getRuntime().exec("/etc/init.d/nscd restart");
                addHostBinding(ip,host);
                String res = getResponseText(url);
                Process process = Runtime.getRuntime().exec("/etc/init.d/nscd restart");
                //Process process2 = Runtime.getRuntime().exec("/etc/init.d/nscd restart");
                deleteHostBinding(ip, host);
                System.err.println(getResponseText("http://www.baidu.com"));
                Process process3 = Runtime.getRuntime().exec("/etc/init.d/nscd restart");
                process.destroy();
                processTest.destroy();
                process3.destroy();
                return res;
        }  

 

 

2.2 同样上面windows下通过反射修改jdk的DNS缓存,同样再执行下面这个脚本就ok了。

 

附上测试程序:

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;


public class HostUtil3 {

	public static final String  hostFilePath="C:\\Windows\\System32\\drivers\\etc\\hosts";
//	public static final String  hostFilePath="/etc/hosts";
	
	public static void addHostBinding(String ip, String host){
		Map<String,String>  hostToIpMap = readFromIpHostFile();
		hostToIpMap.put(host, ip);
		writeIpHostToReader(hostToIpMap);
	}
	
	public static void deleteHostBinding(String ip, String host){
		Map<String,String>  hostToIpMap = readFromIpHostFile();
		if(hostToIpMap != null && hostToIpMap.containsKey(host)){
			hostToIpMap.remove(host);
		}
		writeIpHostToReader(hostToIpMap);
	}
	
	public static Map<String,String> readFromIpHostFile(){
		Map<String,String>  hostToIpMap = new HashMap<String,String>();
		BufferedReader bufferReader= null;
		try {
			bufferReader = new BufferedReader(new FileReader(hostFilePath));
			String str = null;
			while((str = bufferReader.readLine()) != null){
				if(str != null){
					String[] ipAndHost = str.split(" ");
					if(ipAndHost != null && ipAndHost.length == 2 && ipAndHost[0] != null && ipAndHost[0].charAt(0) != '#'){
						hostToIpMap.put(ipAndHost[1], ipAndHost[0]);
					}
				}
			}

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try{
				bufferReader.close();
			}catch(Exception e){
				
			}
		}
		return hostToIpMap;
	}
	
	public static void writeIpHostToReader(Map<String,String> hostToIpMap){
		BufferedWriter bufferedWriter = null;
		try {
			bufferedWriter = new BufferedWriter(new FileWriter(hostFilePath));
			Iterator<Entry<String,String>> iter = hostToIpMap.entrySet().iterator();
			while(iter.hasNext()){
				Entry<String,String> entry = iter.next();
				bufferedWriter.write(entry.getValue() + "   " + entry.getKey() + "\n");
			}

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try{
				bufferedWriter.close();
			}catch(Exception e){
				
			}
		}
	}
	
	/**
	 * 请求接口数据并返回每一行的数据列表
	 * 
	 * @param queryUrl
	 * @return
	 */
	public static String getResponseText(String queryUrl) {
		InputStream is = null;
		BufferedReader br = null;
		StringBuffer res = new StringBuffer();
		try {
			URL url = new URL(queryUrl);
			HttpURLConnection httpUrlConn = (HttpURLConnection) url
					.openConnection();
			httpUrlConn.setRequestMethod("GET");
			httpUrlConn.setDoOutput(true);
			httpUrlConn.setConnectTimeout(2000);

			is = httpUrlConn.getInputStream();

			br = new BufferedReader(new InputStreamReader(is, "utf-8"));

			String data = null;
			while ((data = br.readLine()) != null) {
				res.append(data + "\n");
			}
			return res.toString();

		} catch (IOException e) {
		} catch (Exception e) {
		} finally {
			if (br != null) {
				try {
					br.close();
				} catch (IOException e) {
				}
			}
		}
		return null;
	}
	
	public static void jdkDnsNoCache() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
		 Class clazz = java.net.InetAddress.class;
	        final Field cacheField = clazz.getDeclaredField("addressCache");
	        cacheField.setAccessible(true);
	        final Object o = cacheField.get(clazz);
	        Class clazz2 = o.getClass();
	         final Field cacheMapField = clazz2.getDeclaredField("cache");
	        cacheMapField.setAccessible(true);
	        final Map cacheMap = (Map)cacheMapField.get(o);
	        AccessController.doPrivileged(new PrivilegedAction() {
	            public Object run() {
	                try{
	                    synchronized(o){//同步是必须的,因为o可能会有多个线程同时访问修改。
//	                        cacheMap.clear();//这步比较关键,用于清除原来的缓存
	                    	cacheMap.remove("www.baidu.com");
	                    }   
	                }catch(Throwable te){
	                    throw new RuntimeException(te);
	                }   
	                return null;
	            }   
	        }); 
	        
	}
	
	
	public static void test() throws IOException, InterruptedException{
		addHostBinding("127.0.0.1","www.baidu.com");
		System.err.println(getResponseText("http://www.baidu.com"));

		System.err.println("************************************************************");
		deleteHostBinding("127.0.0.1","www.baidu.com");
		try {
			jdkDnsNoCache();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
        InetAddress address = InetAddress.getByName("www.baidu.com");
        System.out.println(System.currentTimeMillis()+":::"+address.getHostAddress());
		System.err.println(getResponseText("http://www.baidu.com"));
	}
	
	public static void main(String[] args) throws IOException, InterruptedException{
		test();
//		updateDNS();
	}
	
}
 

 

在windows下得输出:

 

 null
************************************************************
1319035631098:::119.75.217.56
<!doctype html><html><head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"><title>?????????????      </title><style>html{overflow-y:auto}body{font:12px arial;text-align:center;background:#fff}body,p,form,ul,li{margin:0;padding:0;list-style:none}body,form,#fm{position:relative}td{text-align:left}img{border:0}a{color:#00c}a:active{color:#f60}#u{padding:7px 10px 3px 0;text-align:right}#m{width:680px;margin:0 auto}#nv{font-size:16px;margin:0 0 4px;text-align:left;text-indent:117px}#nv a,#nv b,.btn,#lk{font-size:14px}#fm{padding-left:90px;text-align:left}#kw{width:404px;height:22px;padding:4px 7px;padding:6px 7px 2px\9;font:16px arial;background:url(http://www.baidu.com/img/i-1.0.0.png) no-repeat -304px 0;_background-attachment:fixed;border:1px solid #cdcdcd;border-color:#9a9a9a #cdcdcd #cdcdcd #9a9a9a;vertical-align:top}.btn{width:95px;height:32px;padding:0;padding-top:2px\9;border:0;background:#ddd url(http://www.baidu.com/img/i-1.0.0.png) no-repeat;cursor:pointer}.btn_h{background-position:-100px 0}#kw,.btn_wr{margin:0 5px 0 0}.btn_wr{width:97px;height:34px;display:inline-block;background:url(http://www.baidu.com/img/i-1.0.0.png) no-repeat -202px 0;_top:1px;*position:relative}#lk{margin:33px 0}#lk span{font:14px "????"}#lm{height:60px}#lh{margin:16px 0 5px;word-spacing:3px}.tools{position:absolute;top:-4px;*top:10px;right:-13px;}#mHolder{width:62px;position:relative;z-index:296;display:none}#mCon{height:18px;line-height:18px;position:absolute;cursor:pointer;padding:0 18px 0 0;background:url(http://www.baidu.com/img/bg-1.0.0.gif) no-repeat right -134px;background-position:right -136px\9}#mCon span{color:#00c;cursor:default;display:block}#mCon .hw{text-decoration:underline;cursor:pointer}#mMenu{width:56px;border:1px solid #9a99ff;list-style:none;position:absolute;right:7px;top:28px;display:none;background:#fff}#mMenu a{width:100%;height:100%;display:block;line-height:22px;text-indent:6px;text-decoration:none}#mMenu a:hover{background:#d9e1f6}#mMenu .ln{height:1px;background:#ccf;overflow:hidden;margin:2px;font-size:1px;line-height:1px}#cp,#cp a{color:#77c}#sh{display:none;behavior:url(#default#homepage)}</style>
</head>
<body><div id="u"><a href="http://www.baidu.com/gaoji/preferences.html" name="tj_setting">????????</a>&nbsp;|&nbsp;<a href="http://passport.baidu.com/?login&tpl=mn" name="tj_login">???</a></div>
<div id="m"><p id="lg"><img src="http://www.baidu.com/img/baidu_sylogo1.gif" width="270" height="129" usemap="#mp"><map name="mp"><area shape="rect" coords="40,25,230,95" href="http://hi.baidu.com/baidu/" target="_blank" title="?????? ??????" ></map></p><p id="nv"><a href="http://news.baidu.com">??&nbsp;??</a>??<b>??&nbsp;?</b>??<a href="http://tieba.baidu.com">??&nbsp;??</a>??<a href="http://zhidao.baidu.com">?&nbsp;??</a>??<a href="http://mp3.baidu.com">MP3</a>??<a href="http://image.baidu.com">?&nbsp;?</a>??<a href="http://video.baidu.com">??&nbsp;?</a>??<a href="http://map.baidu.com">??&nbsp;?</a></p><div id="fm"><form name="f" action="/s"><input type="text" name="wd" id="kw" maxlength="100"><input type="hidden" name="rsv_bp" value="0"><input type="hidden" name="rsv_spt" value="3"><span class="btn_wr"><input type="submit" value="??????" id="su" class="btn" onmousedown="this.className='btn btn_h'" onmouseout="this.className='btn'"></span></form><span class="tools"><span id="mHolder"><div id="mCon"><span>????</span></div></span></span><ul id="mMenu"><li><a href="#" name="ime_hw">??д</a></li><li><a href="#" name="ime_py">???</a></li><li class="ln"></li><li><a href="#" name="ime_cl">???</a></li></ul></div>
<p id="lk"><a href="http://hi.baidu.com">???</a>??<a href="http://baike.baidu.com">???</a>??<a href="http://www.hao123.com">hao123</a><span> | <a href="/more/">???&gt;&gt;</a></span></p><p id="lm"></p><p><a id="sh" onClick="this.setHomePage('http://www.baidu.com')" href="http://utility.baidu.com/traf/click.php?id=215&url=http://www.baidu.com" onmousedown="return ns_c({'fm':'behs','tab':'homepage','pos':0})">??????????</a></p>
<p id="lh"><a href="http://e.baidu.com/?refer=888">?????????</a> | <a href="http://top.baidu.com">?????????</a> | <a href="http://home.baidu.com">??????</a> | <a href="http://ir.baidu.com">About Baidu</a></p><p id="cp">&copy;2011 Baidu <a href="/duty/">?????????</a> <a href="http://www.miibeian.gov.cn" target="_blank">??ICP?030173??</a> <img src="http://gimg.baidu.com/img/gs.gif"></p></div></body>
<script>var w=window,d=document,n=navigator,k=d.f.wd,a=d.getElementById("nv").getElementsByTagName("a"),isIE=n.userAgent.indexOf("MSIE")!=-1&&!window.opera,sh=d.getElementById("sh");if(isIE&&sh&&!sh.isHomePage("http://www.baidu.com")){sh.style.display="inline"}for(var i=0;i<a.length;i++){a[i].onclick=function(){if(k.value.length>0){var C=this,A=C.href,B=encodeURIComponent(k.value);if(A.indexOf("q=")!=-1){C.href=A.replace(/q=[^&\x24]*/,"q="+B)}else{this.href+="?q="+B}}}}(function(){if(/q=([^&]+)/.test(location.search)){k.value=decodeURIComponent(RegExp["\x241"])}})();if(n.cookieEnabled&&!/sug?=0/.test(d.cookie)){d.write("<script src=http://www.baidu.com/js/bdsug.js?v=1.0.3.0><\/script>")}function addEV(C,B,A){if(w.attachEvent){C.attachEvent("on"+B,A)}else{if(w.addEventListener){C.addEventListener(B,A,false)}}}function G(A){return d.getElementById(A)}function ns_c(E){var F=encodeURIComponent(window.document.location.href),D="",A="",B="",C=window["BD_PS_C"+(new Date()).getTime()]=new Image();for(v in E){A=E[v];D+=v+"="+A+"&"}B="&mu="+F;C.src="http://nsclick.baidu.com/v.gif?pid=201&pj=www&"+D+"path="+F+"&t="+new Date().getTime();return true}if(/\bbdime=[12]/.test(d.cookie)){document.write("<script src=http://www.baidu.com/cache/ime/js/openime-1.0.0.js><\/script>")}(function(){var B=G("user"),A=G("userMenu");if(B&&A){addEV(B,"click",function(C){A.style.display=A.style.display=="block"?"none":"block";window.event?C.cancelBubble=true:C.stopPropagation()});addEV(document,"click",function(){A.style.display="none"})}})();(function(){var E=G("u").getElementsByTagName("a"),C=G("nv").getElementsByTagName("a"),I=G("lk").getElementsByTagName("a"),B="";var A=["news","tieba","zhidao","mp3","img","video","map"];var H=["hi","baike","hao123","more"];if(G("un")&&G("un").innerHTML!=""){B=G("un").innerHTML}function D(J){addEV(J,"mousedown",function(L){var L=L||window.event;var K=L.target||L.srcElement;ns_c({fm:"behs",tab:K.name||"tj_user",un:encodeURIComponent(B)})})}for(var F=0;F<E.length;F++){D(E[F])}for(var F=0;F<C.length;F++){C[F].name="tj_"+A[F];D(C[F])}for(var F=0;F<I.length;F++){I[F].name="tj_"+H[F];D(I[F])}})();addEV(w,"load",function(){k.focus()});w.onunload=function(){};</script>


<script type="text/javascript" src="http://www.baidu.com/cache/hps/js/hps-1.1.1.js"></script>
</html><!--6f1d70970a531a5f-->
 

 

分享到:
评论
4 楼 oldrat 2015-04-14  
不能 删除 写的不对的评论,楼主我错了。。。

你能删除了吗? 
3 楼 oldrat 2015-04-14  
写了操作Java DNS Cache的库 https://github.com/alibaba/java-dns-cache-manipulator  如何动态修改DNS可以方便些
2 楼 oldrat 2015-04-14  
写了操作
Java DNS Cache
的库 https://github.com/alibaba/java-dns-cache-manipulator  如何动态修改
DNS
可以方便些
1 楼 oldrat 2015-04-14  
写了操作Java DNS Cache的库 https://github.com/alibaba/java-dns-cache-manipulator  如何动态修改DNS可以方便些

相关推荐

    linux下如何快速让DNS修改生效

    然而,需要注意的是,如果你的网络环境使用了代理或者有其他特殊的DNS配置,可能还需要额外的步骤来确保DNS更改的即时生效。总之,理解DNS的工作原理和你的系统是如何处理DNS缓存的,将有助于你更高效地进行域名IP的...

    使用域名绑定tomcat

    完成上述配置后,记得重启Tomcat服务以使更改生效。 注意,为了安全起见,你可能还需要配置SSL证书来启用HTTPS,这在涉及到用户隐私数据传输时尤其重要。这需要在`&lt;Connector&gt;`元素中添加相关配置,并且可能需要...

    mygodaddy绑定dns配置.pdf

    在IT行业中,域名管理系统(DNS)是互联网服务的...同时,DNS更改可能需要一段时间(通常48小时)才能在全球范围内完全生效,这被称为DNS propagation。在此期间,耐心等待并检查你的设置是否按预期工作是非常必要的。

    TOMCAT多域名绑定

    Tomcat,作为Apache软件基金会的一个开源项目,是Java Servlet和JavaServer Pages(JSP)的标准实现,广泛用于搭建Java Web应用程序。 在Tomcat中实现多域名绑定,主要涉及以下知识点: 1. **虚拟主机(Virtual ...

    tomcat 域名绑定

    当我们有多个项目需要绑定到同一个域名时,我们可以在 &lt;Host&gt; 标签中添加多个 &lt;Context&gt; 标签,以实现多项目绑定。例如:&lt;Host name=...

    tomcat域名绑定

    - 如果对`web.xml`或`lib`进行了修改,可能需要重新启动Tomcat才能使更改生效。 - 对于安全性较高的环境,建议使用HTTPS协议,此时需要配置SSL Connector。 - 需要在DNS服务器中正确配置域名解析,确保域名能够正确...

    详解Tomcat Web 应用绑定域名的几种方式

    在当今的Web开发和部署中,Tomcat作为一款广泛使用的开源Java应用服务器,经常被用于运行Java Web应用。而在实际部署中,为了让用户能通过更友好、更直观的方式访问Web应用,通常需要将Web应用绑定到一个域名或子...

    PHP服务器上配置apache绑定多域名[参考].pdf

    修改配置后,记得保存文件并重启Apache服务,使改动生效。重启命令根据操作系统不同而不同,例如在Linux系统中,可以使用`sudo systemctl restart apache2`或`sudo service apache2 restart`。 4. **DNS配置**: ...

    nginx 服务绑定域名的方法

    配置域名绑定时,可以使用完全匹配、通配符或正则表达式来匹配请求头中的Host字段。 首先,可以通过在server块中列出具体的域名来实现完全匹配,例如: ```nginx server { listen 80 default_server; server_***;...

    详解Tomcat多域名配置(多个项目共用80端口)

    在当前的互联网环境下,Tomcat服务器作为一款应用广泛的开源Java Web服务器,是企业部署Java应用的主要选择之一。为了实现项目的高效部署和资源的最大化利用,有时需要在单个服务器上配置多个域名来对应不同的项目。...

    Linux操作系统下的SMB、DHCP、DNS、FTP、MAIL、WEB六个服务总结可用.pdf

    若需要MAC-IP绑定,可在配置文件中添加`host`段,指定物理地址和固定IP地址。 三、DNS服务(Domain Name System) DNS服务的核心功能是将域名转换为IP地址。主配置文件`/etc/named.conf`,正向区域文件如`/var/...

    tomcat 多域名配置

    在IT行业中,Tomcat是一个广泛使用的开源Java Servlet容器,它实现了Java EE的Web部分,包括Servlet和JSP规范。当你需要在同一台服务器上部署多个基于不同域名的应用时,就需要进行多域名配置。以下是对"tomcat多...

    Lamp环境下设置绑定apache域名的方法分析

    - `ServerName` 主服务器名称,用于响应DNS解析请求。 `&lt;IfModule prefork.c&gt;` 部分是关于Apache的预派生多进程模型(Prefork MPM)的配置,包括: - `StartServers` 初始启动的子进程数。 - `MinSpareServers` ...

    Apache 2配置域名绑定的方法详解

    Apache 2是世界上最流行的Web服务器软件之一,其强大的功能和灵活性使其成为托管网站和应用程序的首选。...希望这篇文章对你在配置Apache 2域名绑定时提供帮助。如果你在过程中遇到任何疑问,欢迎留言讨论,共同进步。

    Tomcat服务器配置

    - 在IIS中添加相应的站点,并为其配置正确的DNS名称和IP地址绑定。 10. **添加映射文件**: - 在IIS中为每个站点添加映射文件,指定不同扩展名的处理程序。 - 例如,将.jsp文件的处理程序设置为ISAPI筛选器。 11...

    LINUX下DHCP服务器的配置

    DHCP (Dynamic Host Configuration Protocol) 是一种网络管理协议,它允许网络管理员自动分配或重新分配IP地址以及其他网络配置参数,如子网掩码、默认网关、DNS服务器等,给网络上的设备。在Linux系统中,配置DHCP...

    单台服务器中利用Apache的VirtualHost如何搭建多个Web站点详解

    修改配置后,需要重启Apache服务以使更改生效。在Linux环境下,可以使用以下命令: ``` sudo systemctl restart httpd ``` 6. **DNS配置**: 为了让用户可以通过域名访问各个站点,需要在DNS系统中为每个站点...

    给tomcat 服务器配置域名

    3. 为了使更改生效,需要重启Tomcat服务器。执行`bin/shutdown.sh`(Linux或Mac)或`bin/shutdown.bat`(Windows)停止Tomcat,然后执行`bin/startup.sh`或`bin/startup.bat`启动它。 4. 配置服务器防火墙规则和...

    常见的TCPIP体系协议安全隐患和应对方法.pdf

    对策包括使用DNSSEC(DNS Security Extensions)进行签名验证,避免被篡改的DNS记录生效,以及定期更新DNS服务器的缓存清理恶意数据。 5. 综合防御策略: - 实施网络访问控制列表(ACLs)限制特定流量。 - 使用...

    思科路由配置

    在企业级网络环境中,DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)服务器起着至关重要的作用。它能够自动为网络中的客户端分配IP地址及相关配置信息,简化了网络管理,提高了网络效率。本文将...

Global site tag (gtag.js) - Google Analytics