• Tomcat发布项目时,浏览器地址栏图标的问题


    最近在做一个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 Data360sedataico文件夹中,以“站点名.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(密技摘录,仅作备份)

  • 相关阅读:
    LeetCode Binary Tree Inorder Traversal
    LeetCode Populating Next Right Pointers in Each Node
    LeetCode Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode Reverse Linked List II
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Pascal's Triangle
    Palindrome Construct Binary Tree from Preorder and Inorder Traversal
    Pascal's Triangle II
    LeetCode Word Ladder
    LeetCode Binary Tree Zigzag Level Order Traversal
  • 原文地址:https://www.cnblogs.com/coprince/p/5719246.html
Copyright © 2020-2023  润新知