问题描述:
公司的一个Springboot项目,发现favicon.ico不显示。前端页面favicon.ico文件没有报404,但无法正常显示,浏览器单独访问favicon.ico链接,结果如下图这个样子,灰不溜丢的,不知道为毛线呀?
网上查询资料:有人说要开启spring.mvc.favicon.enabled=true,试了一下,发现springboot2.0之后spring没有这个参数了,完犊子。
还有人说前端要加下列代码,这不废话么,前端肯定要加呀。
<link type="image/x-ico" href="/favicon.ico" rel="shortcut icon" />
还有其他方案,我都试了一遍,最后结论都完犊子,还是无法显示favicon.ico。
最后,经过我坚持不懈、持之以恒、锲而不舍的努力下,终于搞定啦。
经过maven编译后,我发现target中的favicon.ico文件不能正常显示,如下图:
卧槽!那肯定maven编译出现问题了。
我查看pom.xml文件,添加build.resources节点,更改maven的编译规则,如下代码,
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.ico</exclude>
</excludes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.ico</include>
</includes>
<filtering>false</filtering>
</resource>
</resource>
</build>
解释一下这两个resource节点,第一个resource.excludes排除resources资源的favicon.ico文件,而其他文件文件,如application.xml等可以用替换占位符(<filtering>true</filtering>),一句话,除了favicon.icon文件其他文件可以替换占位符。
第二个resouce.include复制favicon.ico到编译环境中,不能替换占位(<filtering>false</filtering>),一句话,favicon.icon不能用替换占位符
感兴趣的小伙伴可以测试一下,将第二个resouce.filtering改成true,看一侃favicon.ico会什么样子。
maven编译后,target可以正常显示favicon.ico文件了,如下图:
然后我在浏览器单独访问favicon.ico链接,也可以正常显示啦。
如果到这就结束,那就不是合格的程序员,我不断问自己,为毛线会出现这种问题?为毛线?为毛线?为毛线?....
我复盘问题的关键点是:favicon.ico不可以用<filtering>true</filtering> 查询资料发现:maven.resource如果开启filtering,那么有可能损坏二进制文件,比如图片、pdf等,原文内容结尾处如下:
As already mentioned filtering binary files like images,pdf`s etc. could result in corrupted output. To prevent such problems you can configure file extensions which will not being filtered.
最后启动项目,favicon.ico正常显示,完结撒花!