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; }