最近在做一个Java网络应用程序,服务器是tomcat。在默认情况下,当用户访问该网络应用时,地址栏图标显示为tomcat猫。我希望把它换成自己的图标,于是研究了一下。在研究过程中,我发现网上的资料大都语焉不详,于是把自己的研究结果分享出来。本文的测试环境为:

tomcat 6.0.20
IE6 SP3
Firefox 3.6.13
搜狗高速浏览器 2.2.0
360安全浏览器 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里加入这么一段:

<icon>
  <small-icon>/images/small.gif</small-icon>
  <large-icon>/images/large.gif</large-icon>
</icon>

其中/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,在其中加入这么一段:

<mime-mapping>
  <extension>ico</extension>
  <mime-type>image/x-icon</mime-type>
</mime-mapping>

其实这段的主要作用在于当用户通过浏览器请求后缀名为.ico的资源时,tomcat告知浏览器该资源的媒体类型,以指导浏览器
适当地在显示区域展现该资源。而对于地址栏的图标数据,即使不特别指定媒体类型,浏览器应该也有能力处理。反正据我观察,加不加这段话对于地址栏图标的显
示来说效果是一样的。

4. 据说除了覆盖favicon.ico以外,还要把同目录下的tomcat.svg也搞掉。不过据我观察,搞不搞掉它效果是一样的。

使用这个方法后,各个浏览器的显示效果如下:
@ IE6只在地址栏显示那个一如既往的e图标,但是保存到收藏夹后可以看到效果。实际上,当访问百度之类的网站时,IE6也不在地址栏那里显示百度的图标,因此我也不指望能比百度做得更好。
@ Firefox在地址栏显示更改后的图标。
@ 搜狗高速浏览器在地址栏显示更改后的图标。
@ 360安全浏览器在地址栏显示更改后的图标。
@ 傲游浏览器在地址栏显示更改后的图标。

方法二,修改应用程序的页面。

在每个显示在顶层窗口的网页里的<head></head>里加入这么一段:

<link rel="icon" href="/***/my.ico" type="image/x-icon" />
<link rel="shortcut icon" href="/***/my.ico" type="image/x-icon" />
<link rel="bookmark" href="/***/my.ico" type="image/x-icon" />

注意以下几点:

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,在其中加入这么一段:

<mime-mapping>
  <extension>ico</extension>
  <mime-type>image/x-icon</mime-type>
</mime-mapping>

不过据我观察,应该也是用不着。

使用这个方法后,各个浏览器的显示效果如下:
@ IE6,地址栏显示e图标,收藏夹显示更改后的图标。
@ Firefox在地址栏显示更改后的图标。
@ 搜狗高速浏览器在地址栏显示tomcat猫。
@ 360安全浏览器在地址栏显示tomcat猫。
@ 傲游浏览器在地址栏显示更改后的图标。

换一种说法,搜狗高速浏览器和360安全浏览器只买方法一的账,其它三款浏览器既买方法一的账也买方法二的账。如果同时使用方法一和方法二,则方法二的优先级更高(因为tomcat猫就是方法一的默认图标)。

这两种方法各有千秋。我比较喜欢方法一,理由是简单方便,而且测试全数通过。缺点是修改了整个tomcat的配置,影响了其中运
行的所有应用程序的地址栏图标。不过如果这些应用程序本来就应该使用同一地址栏图标的话(比如某家公司的全部应用程序都使用该公司的logo作为图标),
那就不成为问题。方法二的主要问题在于不被搜狗高速浏览器和360安全浏览器所支持,而且需要改动所有显示在顶层窗口的页面,有些麻烦。不过我觉得方法二
代表了地址栏图标的发展方向,虽然目前不被搜狗高速浏览器和360安全浏览器所支持,但是说不定将来就会被支持。而且虽然要改动很多页面是有点麻烦,不过
只拷贝几行代码的话,其实也算不了什么。况且方法二有一个很大的优点,就是可以在不影响其它应用程序的情况下改动tomcat中的某个应用程序,这点是方
法一所不具备的。

原文地址:http://hi.baidu.com/hebo_thu/item/fc8c81bb164f5cee4fc7fd90(密技摘录,仅作备份)

Tomcat发布项目时,浏览器地址栏图标的问题的更多相关文章

  1. tomcat发布项目时,localhost可以访问,用ip地址不能访问,同时其他电脑也不能访问。

    最近在开发项目中,遇到的一个问题是:在 tomcat中发布一个web项目,但是发布成功后,只能用http://localhost:8080/aml访问项目,不能用http://172.0.0.1:80 ...

  2. tomcat发布项目时,空文件夹未发布成功

    问题背景: 项目发布到服务器时,缺少文件夹,到时向此文件夹写数据时发生错误. 后来经查,缺少这个文件夹,项目部署发布时,并不会把空文件夹发布上去 解决: 1.在空文件中加入,一个文件.就可以发布成功 ...

  3. Eclipse使用Tomcat发布项目时出现YadisException异常解决方案

    调整使用Eclipse的JDK版本,大概JDK版本过低会出现这个org.openid4java.discovery.yadis.YadisException: 0x704: I/O transport ...

  4. eclipse发布项目时,会自动还原server.xml和content.xml文件

    因为Tomcat的端口冲突,导致eclipse发布项目时,失败.于是到server.xml文件中修改端口,重启使用eclipse发布项目,发现依然报端口冲突的错误,其原因时,刚才对server.xml ...

  5. Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life

    Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life ...

  6. Tomcat部署项目修改浏览器上猫咪头像

    一.发现问题用tomcat部署项目,在浏览器标签也上发现了tomcat猫咪图.要把这个图修改掉. 二.解决问题apache-tomcat-5.5.28\webapps\ROOT下的ico文件,将需要替 ...

  7. Tomcat-在发布项目时两次重复加载的问题介绍与解决

      前提: 如 1.存在某个应用:hello 2.该应用存放路径:D:\apache-tomcat-5.5.17\webapps\hello 3.Tomcat的server.xml部分配置信息如下: ...

  8. [实战篇]Tomcat发布项目-虚拟目录

    在二阶段学习的过程中,我一直使用MyEclipse的方式把工作空间的项目发布到webapps目录下,这种方式自我感觉在实际开发中应用能在70%左右,但是如何涉及到一些上传操作等操作, 从新发布项目之后 ...

  9. tomcat启动项目时一直在跑,项目没起来

    1. 在整合maven项目时我遇到一个问题,tomcat启动项目总是报超时,后来我把timeout调到180秒,还是启动超时.看了不是timeout时间短的问题. 2.弄了一天也没解决,后来请大神给看 ...

随机推荐

  1. Android Studio导入Project的方法

    Android Studio到现在已经发展到0.8+的版本了,最近也在试着使用它,原因是多方面的,一个毕竟是未来的趋势,二则是github上越来越多的大牛开源项目都是基于Android Studio的 ...

  2. LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据

    http://www.cnblogs.com/yukaizhao/archive/2010/05/13/linq_to_sql_1.html LINQ和 LINQ to SQL 都已经不是一个新事物了 ...

  3. 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符

    正常URL: http://localhost:16990/GoodsOrder/OrderRevoke.aspx??6G5lFi6xuoiLDhfOOOIkBYwy8RGpkfuza2gLlJrlT ...

  4. IE10、IE11 无法写入Cookie

    IE10.IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题 你是否遇到过当使用一个涉及到Cookie操作的网站或者管理系统时,IE 6.7.8.9下都跑的好好的, ...

  5. Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇

    一.面向对象之多态 1.多态:简而言子就是多种形态或多种类型 python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型, java多态传参:必须是传参数的数据类型或传 ...

  6. C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

  7. ORA-01013:用户请求取消当前的操作

    ORA-01013:用户请求取消当前的操作 在测试一个通过ODBC连接ORACLE数据库的VB程序时,总是出现该错误,估计应该是数据量比较大,导致超时. 查到解决方法有如下四种 (选任意一种即可): ...

  8. 我对javascript的自以为是

    参数的作用域 if(true){ var tester = "Hello World"; } console.log(tester); 按照以往的经验,觉得上面的代码会报错,而实际 ...

  9. 多线程编程之Linux环境下的多线程(二)

    上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...

  10. .NET和java的RSA互通,仅此而已

    .NET和java的RSA互通,仅此而已 在开始这篇文章之前,先请读者朋友阅读老唐的这两篇文章: 1.Java与.Net环境下RSA加密解密交互不成功的问题解决 2.Java与.Net环境下RSA加密 ...