1. 程式人生 > >Tomcat釋出專案時,瀏覽器位址列圖示的問題

Tomcat釋出專案時,瀏覽器位址列圖示的問題

最近在做一個java網路應用程式,伺服器是tomcat。在預設情況下,當用戶訪問該網路應用時,位址列圖示顯示為tomcat貓。我希望把它換成自己的圖示,於是研究了一下。在研究過程中,我發現網上的資料大都語焉不詳,於是把自己的研究結果分享出來。本文的測試環境為:tomcat 6.0.20IE6 SP3Firefox 3.6.13搜狗高速瀏覽器 2.2.0360安全瀏覽器 3.6.1傲遊瀏覽器 2.5.17首先說明一下,我這個程式的使用者一般使用的是基於IE6核心的外殼瀏覽器,比如搜狗高速瀏覽器、360安全瀏覽器和傲遊瀏覽器等,也有少數的使用者使用Firefox,所以我測試的瀏覽器主要就是這幾款瀏覽器。至於其它的數得上號的瀏覽器,我猜本文提供的方法也能夠大體上適用。不過這也僅僅是猜測,如果說得不對,還請見諒或者指出。下面分析一下各個瀏覽器對於位址列圖示的快取機制。為什麼要分析這個呢?因為在大多數情況下,如果不清空位址列圖示的快取,那麼即使改變了伺服器端設定的位址列圖示,在瀏覽器端也不會立刻反映出來,這就給測試帶來了困難。而瀏覽器們對於位址列圖示的快取機制又不盡相同,因此有必要逐個加以分析。IE6和Firefox的快取機制相對簡單,即位址列圖示與其它需要快取的資料存放在同一位置,因此一般的清空快取操作對位址列圖示同樣適用。但是,基於IE核心的三款瀏覽器卻把位址列圖示與其它需要快取的資料分開存放,必須使用手動的方法進行清除。搜狗高速瀏覽器把位址列圖示快取在使用者目錄下的Application Data/SogouExplorer/FavIcon資料夾中,其中主要起作用的是FavorIcon.db這個檔案,此外還有一系列叫做s*.ico的檔案,這些檔案是在“最常訪問欄”等處用到的圖示檔案。清空搜狗高速瀏覽器的位址列圖示的快取較為麻煩,因為FavorIcon.db檔案似乎必須在搜狗高速瀏覽器關閉的情況下才能刪除,因此推薦的方法是,在搜狗高速瀏覽器的“隱私保護”那裡把所有快取資料都刪除,然後關閉搜狗高速瀏覽器,再把FavIcon資料夾中的所有檔案都刪除(清空快取資料後,搜狗高速瀏覽器的“最常訪問欄”等處也被清空了,所以那些s*.ico也就沒用了)。然後再開啟搜狗高速瀏覽器,這樣就算是清空了位址列圖示的快取。360安全瀏覽器又是另一種情況。它把位址列圖示快取在使用者目錄下的Application Data\360se\data\ico資料夾中,以“站點名.ico”為名儲存起來。所以只要找到對應的ico檔案,刪除了就可以了。但是有一點需要注意,假如站點名包含埠資訊,比如“127.0.0.1:8080”,那麼它的快取檔案就會是一個空檔案,而且瀏覽器也只會在位址列裡顯示預設的綠e圖示。我猜這是360安全瀏覽器的某種bug,因為在Windows系統下檔名裡是不能含有冒號的,所以說不定就是這樣。而不包含埠資訊的站點,也就是埠為預設的80的站點,比如“127.0.0.1”,是不存在這樣的問題的。傲遊瀏覽器把位址列圖示快取在安裝目錄的Favicons資料夾中,但是檔名是自動生成的。如果你能找到對應的檔案,那麼刪除了就可以了。如果找不到或者懶得找,那麼把Favicons資料夾中的所有檔案都刪除了也就是了。除了清空瀏覽器的位址列圖示的快取以外,還有一種辦法可以繞過這個問題,那就是改變tomcat的服務埠然後重啟tomcat。在測試過程中,這個辦法可以同時對付多個瀏覽器,所以還是比較方便的。只不過由於上面提及的原因,這個辦法不能很好地兼顧360安全瀏覽器。下面進入正題,如何替換tomcat的貓圖示。我首先嚐試的方法是在應用程式的web.xml里加入這麼一段: /images/small.gif /images/large.gif其中/images/small.gif和/images/large.gif是我製作的兩個gif檔案,大小分別為16×16畫素和32×32畫素。但是這個方法不管用,原因不知道。如有知道的兄者,還請賜教。然後我又進行了各種各樣的嘗試,發現了兩種管用的方法。這兩種方法各有利弊。方法一,修改整個tomcat的配置。首先製作一個名為favicon.ico的圖示檔案,然後進入tomcat的webapps下的ROOT目錄,把其中的favicon.ico替換成自己的。注意以下幾點:1. favicon.ico應該為16×16畫素或32×32畫素,8位色(256色)或24位色。2. 據說favicon.ico有大小的限制,上限為1.22K[?]。不過據我觀察,超過1.22K也沒關係。比如Firefox官方網站上的favicon.ico大小為2.49K,我儲存下來放到tomcat的webapps下的ROOT目錄裡,也能正常顯示。3. 據說需要修改tomcat的conf下的web.xml,在其中加入這麼一段: ico image/x-icon其實這段的主要作用在於當用戶通過瀏覽器請求字尾名為.ico的資源時,tomcat告知瀏覽器該資源的媒體型別,以指導瀏覽器適當地在顯示區域展現該資源。而對於位址列的圖示資料,即使不特別指定媒體型別,瀏覽器應該也有能力處理。反正據我觀察,加不加這段話對於位址列圖示的顯示來說效果是一樣的。4. 據說除了覆蓋favicon.ico以外,還要把同目錄下的tomcat.svg也搞掉。不過據我觀察,搞不搞掉它效果是一樣的。使用這個方法後,各個瀏覽器的顯示效果如下:@ IE6只在位址列顯示那個一如既往的e圖示,但是儲存到收藏夾後可以看到效果。實際上,當訪問百度之類的網站時,IE6也不在位址列那裡顯示百度的圖示,因此我也不指望能比百度做得更好。@ Firefox在位址列顯示更改後的圖示。@ 搜狗高速瀏覽器在位址列顯示更改後的圖示。@ 360安全瀏覽器在位址列顯示更改後的圖示。@ 傲遊瀏覽器在位址列顯示更改後的圖示。方法二,修改應用程式的頁面。在每個顯示在頂層視窗的網頁裡的里加入這麼一段:注意以下幾點:1. 有人說href必須是絕對路徑,其實沒必要。相對路徑一樣OK。而且檔名不一定是favicon.ico,可以自由地命名。而且也不一定是本地路徑,任何可用的路徑都可以,比如http://www.mozilla.com/favicon.ico。2. 據說rel="shortcut icon"代表位址列圖示,rel="bookmark"代表收藏夾圖示。不過似乎也不能一概而論,比如對於Firefox來說,rel="shortcut icon"是代表位址列圖示沒錯,rel="icon"卻是在收藏夾裡起作用的那一個,rel="bookmark"不起任何作用。但是對於其它瀏覽器來說情況又有所不同,所以比較妥當的做法是把這三個都寫上,然後指向同一個檔案。3. 據說需要修改tomcat的web.xml或者應用程式的web.xml,在其中加入這麼一段: ico image/x-icon不過據我觀察,應該也是用不著。使用這個方法後,各個瀏覽器的顯示效果如下:@ IE6,位址列顯示e圖示,收藏夾顯示更改後的圖示。@ Firefox在位址列顯示更改後的圖示。@ 搜狗高速瀏覽器在位址列顯示tomcat貓。@ 360安全瀏覽器在位址列顯示tomcat貓。@ 傲遊瀏覽器在位址列顯示更改後的圖示。換一種說法,搜狗高速瀏覽器和360安全瀏覽器只買方法一的賬,其它三款瀏覽器既買方法一的賬也買方法二的賬。如果同時使用方法一和方法二,則方法二的優先順序更高(因為tomcat貓就是方法一的預設圖示)。這兩種方法各有千秋。我比較喜歡方法一,理由是簡單方便,而且測試全數通過。缺點是修改了整個tomcat的配置,影響了其中執行的所有應用程式的位址列圖示。不過如果這些應用程式本來就應該使用同一位址列圖示的話(比如某家公司的全部應用程式都使用該公司的logo作為圖示),那就不成為問題。方法二的主要問題在於不被搜狗高速瀏覽器和360安全瀏覽器所支援,而且需要改動所有顯示在頂層視窗的頁面,有些麻煩。不過我覺得方法二代表了位址列圖示的發展方向,雖然目前不被搜狗高速瀏覽器和360安全瀏覽器所支援,但是說不定將來就會被支援。而且雖然要改動很多頁面是有點麻煩,不過只拷貝幾行程式碼的話,其實也算不了什麼。況且方法二有一個很大的優點,就是可以在不影響其它應用程式的情況下改動tomcat中的某個應用程式,這點是方法一所不具備的。原文地址:http://hi.baidu.com/hebo_thu/item/fc8c81bb164f5cee4fc7fd90(密技摘錄,僅作備份)