host文件的做用:html
简述和原理
在你用IE浏览网页的时候,是否碰到过这样的状况。有的网站会出现自动弹出的广告窗口,并且不止一个,占用了带宽,又很烦人。还有的网站进入时要求为浏览器安装插件的对话框,好比最多见3721网络实名和目前网上恶评如潮的淘宝网弹出广告。这些东西最讨厌,机器慢的时候,为了等待这个对话框弹出,要等很长时间,甚至有时候会让人觉得机器死机,并且每次上都会弹出,十分讨厌。有些人提出能够用Maxthon gosurf等利用IE内核的多窗口浏览器来代替IE,这个方法是不错,不过IE的兼容性是最好的,并且IE普及率在90%以上,用的人仍是最多的。还有些人提出能够经过修改注册表来解决,可是这种方法难度大,通常人不太懂,并且存在危险性,万一没改好,会给系统稳定形成很大影响。其实,只要改动一个名叫 hosts的文件,就能够轻松过滤这些烦人的垃圾,并且方便又安全。
在修改以前,咱们先了解一下访问网站的原理。
用IE浏览器访问网站时,首先经过网络上的DNS(域名解析服务)服务器把网络域名,也就是一般所说的网址(好比www.sian.com.cn)解析成 61.172.201.227的IP地址,而后浏览器才能访问它。对于每一个域名请求咱们都要等待域名服务器解析后返回IP信息才能访问网站,这样访问网络的效率是比较低的。而根据Windows系统规定,在浏览器进行DNS请求之前,Windows系统会先检查本身的本地硬盘上的hosts文件中是否有这个网址映射关系,若是有就先调用这个IP地址映射,若是没有再向已知的DNS服务器提出域名解析。也就是说Hosts的请求级别比DNS高。Hosts文件中存在这个网址的IP地址映射的话,浏览器就是直接访问这个IP地址,而不去请求DNS解析了。
动手实战
搞清楚原理以后,咱们就能够动手修改了。
在Windows 98和me系统下,hosts文件在Windows目录,在Windows 2000/XP系统中位于WinntSystem32DriversEtc目录中。Hosts文件没有后缀名,不过用记事本就能打开。右键单击hosts 文件,在“打开方式”中,选择用记事本打开。通常没有修改过的hosts文件,样子以下图
linux
里面只作了一个映射,将localhost映射到127.0.0.1,也就是本机的IP地址。前面有#号的是说明,不起做用的。如今咱们要作的事情,就是将这些插件和广告的网址映射到本机IP地址,这样就不会出现弹出窗口了。
屏蔽插件
首先去除3721的安装插件的提示对话框,将3721的网址都映射为127.0.0.1。
若是你已经安装了3721网络实名,先卸载掉。而后再hosts文件中输入如下内容:
127.0.0.1 www.3721.com
127.0.0.1 cnsmin.3721.com
127.0.0.1 download.3721.com
127.0.0.1 union.3721.com
127.0.0.1 3721.net
127.0.0.1 address.3721.com
127.0.0.1 assistant.3721.com
这里要注意,IP地址输入完毕,至少输入一个空格后再输入网址,空格多一点没有关系。还有,每行只能输入一个IP地址和网址。
windows
里面只作了一个映射,将localhost映射到127.0.0.1,也就是本机的IP地址。前面有#号的是说明,不起做用的。如今咱们要作的事情,就是将这些插件和广告的网址映射到本机IP地址,这样就不会出现弹出窗口了。
屏蔽插件
首先去除3721的安装插件的提示对话框,将3721的网址都映射为127.0.0.1。
若是你已经安装了3721网络实名,先卸载掉。而后再hosts文件中输入如下内容:
127.0.0.1 www.3721.com
127.0.0.1 cnsmin.3721.com
127.0.0.1 download.3721.com
127.0.0.1 union.3721.com
127.0.0.1 3721.net
127.0.0.1 address.3721.com
127.0.0.1 assistant.3721.com
这里要注意,IP地址输入完毕,至少输入一个空格后再输入网址,空格多一点没有关系。还有,每行只能输入一个IP地址和网址。
浏览器
白色框内的就是it世界网站的IP地址,而后在hosts文件中输入如下内容
61.145.121.108 www.it.com.cn
输入完毕后保存,之后再访问it世界网站时,浏览器不会请求DNS解析而是直接调用hosts文件,这样就加快了访问速度。其余网站也能够按照这个方法操做。
2)安全问题
针对windows调用hosts文件的机制,有些病毒会采起修改hosts文件来达到某些目的。所以要注意hosts文件的安全性。除了安装杀毒软件以外,在修改和保存hosts文件后,要给hosts文件加上只读属性,防止病毒修改。
右键单击hosts文件,选择“属性”,弹出属性窗口,在“只读”前面打上勾,按“肯定”退出
安全
public synchronized static boolean updateHostName(String hostName, String ip) throws Exception { if (StringUtils.isEmpty(hostName) || StringUtils.isEmpty(ip)) { throw new BusinessException("HostName or Ip can't be null."); } if (StringUtils.isEmpty(hostName.trim()) || StringUtils.isEmpty(ip.trim())) { throw new BusinessException("HostName or Ip can't be null."); } String splitter = " "; String fileName = null; // 判断系统 if ("linux".equalsIgnoreCase(System.getProperty("os.name"))) { fileName = "/etc/hosts"; } else { fileName = "C://WINDOWS//system32//drivers//etc//hosts"; } // 更新设定文件 List < ? > lines = FileUtils.readLines(new File(fileName)); List <String> newLines = new ArrayList <String>(); boolean findFlag = false; boolean updateFlag = false; for (Object line : lines) { String strLine = (String) line; if (StringUtils.isNotEmpty(strLine) && !strLine.startsWith("#")) { strLine = strLine.replaceAll("/t", splitter); int index = strLine.toLowerCase().indexOf(hostName.toLowerCase()); if (index != -1) { String[] array = strLine.trim().split(splitter); for (String name : array) { if (hostName.equalsIgnoreCase(name)) { findFlag = true; if (array[0].equals(ip)) { // 若是IP相同,则不更新 newLines.add(strLine); break; } // 更新成设定好的IP地址 StringBuilder sb = new StringBuilder(); sb.append(ip); for (int i = 1; i < array.length; i++) { sb.append(splitter).append(array[i]); } newLines.add(sb.toString()); updateFlag = true; break; } } if (findFlag) { break; } } } newLines.add(strLine); } // 若是没有Host名,则追加 if (!findFlag) { newLines.add(new StringBuilder(ip).append(splitter).append(hostName).toString()); } if (updateFlag || !findFlag) { // 写设定文件 FileUtils.writeLines(new File(fileName), newLines); // 确认设定结果 String formatIp = formatIpv6IP(ip); for (int i = 0; i < 20; i++) { try { boolean breakFlg = false; InetAddress[] addressArr = InetAddress.getAllByName(hostName); for (InetAddress address : addressArr) { if (formatIp.equals(address.getHostAddress())) { breakFlg = true; break; } } if (breakFlg) { break; } } catch (Exception e) { logger.warn(e.getMessage()); } Thread.sleep(3000); } } return updateFlag; } private static String formatIpv6IP(String ipV6Addr) { String strRet = ipV6Addr; StringBuffer replaceStr; int iCount = 0; char ch = ':'; if (StringUtils.isNotEmpty(ipV6Addr) && ipV6Addr.indexOf("::") > -1) { for (int i = 0; i < ipV6Addr.length(); i++) { if (ch == ipV6Addr.charAt(i)) { iCount++; } } if (ipV6Addr.startsWith("::")) { replaceStr = new StringBuffer("0:0:"); for (int i = iCount; i < 7; i++) { replaceStr.append("0:"); } } else if (ipV6Addr.endsWith("::")) { replaceStr = new StringBuffer(":0:0"); for (int i = iCount; i < 7; i++) { replaceStr.append(":0"); } } else { replaceStr = new StringBuffer(":0:"); for (int i = iCount; i < 7; i++) { replaceStr.append("0:"); } } strRet = ipV6Addr.trim().replaceAll("::", replaceStr.toString()); } return strRet; }