1. 概述

Favicon 是浏览器中显示的小图标,通常出现在地址栏、书签或标签页标题前,用于标识网站。

虽然 Spring Boot 本身不再提供默认 favicon(自 2.2 版本起已移除,出于安全考虑避免信息泄露),但很多开发者仍希望为自己的应用配置一个个性化的图标。✅

本文将介绍几种在 Spring Boot 应用中自定义 favicon 的方式,涵盖从简单替换到高级定制的多种场景,帮你轻松搞定这个小而关键的细节。


2. 覆盖默认 Favicon(最简单方式)

Spring Boot 支持自动加载 favicon,只需将文件命名为 favicon.ico 并放置在资源目录下即可。

支持的路径优先级如下:

  • src/main/resources/favicon.ico
  • src/main/resources/static/favicon.ico

⚠️ 注意:文件名必须是 **favicon.ico**,否则不会被识别。

Spring Boot 启动时会自动扫描这些位置,找到后直接暴露为 /favicon.ico 接口。无需额外配置,简单粗暴有效。

src/main/resources/favicon.ico

src/main/resources/static/favicon.ico

✅ 推荐做法:把 favicon.ico 放在 src/main/resources/static/ 目录下,符合静态资源组织习惯。


3. 使用自定义路径存放 Favicon

有时候我们不想把图标放在根目录,而是想统一管理在某个图片文件夹中,比如:

src/main/resources/static/images/app-icon.ico

这时就需要禁用自动 favicon 处理,并手动注册一个处理器来指定路径。

步骤一:关闭默认 favicon(可选)

尽管从 Spring Boot 2.2 开始 spring.mvc.favicon.enabled=false 已被标记为废弃(deprecated),但仍可使用,但更推荐的做法是直接覆盖处理逻辑。

步骤二:注册自定义 Handler

通过 SimpleUrlHandlerMapping/favicon.ico 请求映射到指定资源路径:

@Configuration
public class FaviconConfiguration {

    @Bean
    public SimpleUrlHandlerMapping customFaviconHandlerMapping() {
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
        mapping.setOrder(Integer.MIN_VALUE); // 最高优先级,确保拦截生效
        mapping.setUrlMap(Collections.singletonMap("/favicon.ico", faviconRequestHandler()));
        return mapping;
    }

    @Bean
    protected ResourceHttpRequestHandler faviconRequestHandler() {
        ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
        // 指向你存放 favicon 的目录
        ClassPathResource classPathResource = new ClassPathResource("static/images/");
        List<Resource> locations = Arrays.asList(classPathResource);
        requestHandler.setLocations(locations);
        return requestHandler;
    }
}

关键点说明:

  • setOrder(Integer.MIN_VALUE):保证该处理器优先于其他静态资源处理器执行。
  • ClassPathResource("static/images/"):你的 favicon 文件应存放在此目录下,且命名为 favicon.ico
  • ✅ 支持 .ico.png 等格式,但建议使用 .ico 格式以兼容老浏览器。

这样就可以灵活地将 favicon 存放在任意自定义路径中,不再受限于根目录。


4. 优雅禁用 Favicon(避免 404)

如果你的应用完全不需要 favicon,直接删除文件或关闭功能会导致浏览器频繁请求 /favicon.ico 并返回 404 ❌,日志刷屏很烦人。

正确做法:返回空响应

通过一个轻量级 Controller 拦截请求,返回空内容但状态码为 200 OK,避免报错。

@Controller
static class FaviconController {

    @GetMapping("favicon.ico")
    @ResponseBody
    void returnNoFavicon() {
        // 返回空响应,状态码默认 200
    }
}

效果:

  • 浏览器请求 /favicon.ico → 成功响应(无内容)
  • 日志不再出现 404 错误
  • 零资源消耗,干净利落 ✅

💡 提示:这个 Controller 可以内嵌在配置类中,也可以独立成一个组件,视项目结构而定。


5. 总结

方案 适用场景 是否推荐
放在 resources/static/ 快速替换默认图标 ✅ 强烈推荐
自定义路径 + HandlerMapping 图标集中管理需求 ✅ 中大型项目推荐
返回空响应禁用 favicon 完全不需要图标 ✅ 避免 404 踩坑必备

📌 最佳实践建议:

  • 优先使用标准路径 static/favicon.ico,简单高效;
  • 若需路径定制,务必设置 handlerMapping.order 为最低值(最高优先级);
  • 禁用时不要留 404,用空响应优雅处理。

示例代码已托管至 GitHub:https://github.com/baeldung/spring-boot-tutorials/tree/master/basic-customization


原始标题:Guide to the Favicon in Spring Boot | Baeldung