Spring Boot 3 引入 CSS 报 404 的主因是路径写错(如误加 /static)、@EnableWebMvc 覆盖默认静态资源映射,或 Spring Security 未放行 /css/** 等路径;正确做法是 HTML 中用 /css/app.css、删掉 @EnableWebMvc、并在 Security 配置中添加 .requestMatchers("/css/**", "/js/**").permitAll()。

Spring Boot 3 引入 CSS 报 404,绝大多数情况不是资源没放对位置,而是路径写法、拦截器或配置覆盖导致静态资源根本没走到默认处理器。直接改路径或加配置就能解决,不用动构建流程。
HTML 中引用 CSS 的路径写错(最常见)
Spring Boot 3 默认把 src/main/resources/static 当作 Web 根路径,浏览器访问时不需要、也不应该出现 /static/ 这段路径。
错误写法(会 404):<link rel="stylesheet" href="/static/css/app.css">
Spring Boot 会尝试在 /static/static/css/app.css 找文件,自然找不到。
正确写法(去掉 /static):<link rel="stylesheet" href="/css/app.css">
前提是文件实际放在 src/main/resources/static/css/app.css
- Thymeleaf 用户优先用
th:href="@{/css/app.css}",它自动补前缀,不拼错 - Freemarker 或纯 HTML,一律从
/开始写相对根路径,别带../static或./static - 检查浏览器开发者工具 Network 标签页里实际请求的 URL 是什么,对照资源真实位置反推路径是否多了一层
用了 @EnableWebMvc 或自定义了 WebMvcConfigurer
只要项目里有 @EnableWebMvc 注解,Spring Boot 3 的全部默认配置(包括静态资源映射)就失效了,必须手动注册。
典型错误代码:@Configuration@EnableWebMvcpublic class WebConfig implements WebMvcConfigurer { ... }
立即学习“前端免费学习笔记(深入)”;
将 Spring Boot 2.7 项目升级到 Spring Boot 3.5 的实战流程,覆盖版本基线、依赖坐标替换、Jakarta 迁移、配置兼容、异步上下文传递改造与验证门禁。用于企业多模块 Maven 项目升级与排障。
如果你只是想加个拦截器或改点小配置,不要加 @EnableWebMvc —— 它是“全有或全无”开关。
- 删掉
@EnableWebMvc,让 Spring Boot 自动注册ResourceHttpRequestHandler - 如果真需要自定义,必须显式调用
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/")等四类默认路径 - 注意 Spring Boot 3 的包名已变:
org.springframework.web.servlet.config.annotation.WebMvcConfigurer,别导错包
静态资源目录放错位置或被 Maven 忽略
Spring Boot 3 默认只认这四个 classpath 下的路径:classpath:/static、classpath:/public、classpath:/resources、classpath:/META-INF/resources。其他位置一概不扫描。
常见错误:
- 把 CSS 放在 src/main/webapp/css/(传统 WAR 结构,Spring Boot 3 不认)
- 放在 src/main/resources/css/(缺了 static 子目录)
- pom.xml 里写了 <resources> 但没包含 static 目录
- 确认资源在
target/classes/static/css/app.css(编译后路径),不是target/classes/css/ - Maven 构建时若用了自定义
<resources>,确保包含:<directory>src/main/resources</directory> - IDE 编译输出目录也要同步:IntelliJ 需勾选 “Build project automatically”,Eclipse 要启用 “Build Automatically”
Spring Security 拦截了静态资源
Spring Boot 3 + Spring Security 默认会拦截所有请求,包括 /css/**、/js/**,除非显式放行。
错误现象:没配 Security 时 CSS 正常,一加 SecurityFilterChain 就 404。
- 在
SecurityFilterChainbean 里加一句:.requestMatchers("/css/**", "/js/**", "/images/**").permitAll() - 别用
.antMatchers()(已废弃),Spring Boot 3 只认.requestMatchers() - 顺序很重要:放行规则必须写在
.anyRequest().authenticated()之前 - 如果用了
authorizeHttpRequests()的 lambda 写法,确保匹配器链完整,漏写.and()可能导致后续规则失效
真正卡住人的往往不是路径本身,而是某个配置项悄悄覆盖了默认行为——比如一个 @EnableWebMvc 注解,或者 Security 配置里少了一句 permitAll()。先看 Network 请求地址,再查资源编译位置,最后翻配置类有没有“静默接管”,比盲目加配置更省时间。

















