Spring Boot默认静态资源路径有四个:classpath:/static、classpath:/public、classpath:/resources、classpath:/META-INF/resources;其中/static目录下结构1:1映射到URL,如/static/css/style.css可通过/css/style.css访问。

Spring Boot默认静态资源路径有哪些
Spring Boot会自动从 classpath:/static、classpath:/public、classpath:/resources 和 classpath:/META-INF/resources 这四个 classpath 路径下查找静态资源。只要把 style.css 放在 src/main/resources/static/css/style.css,它就能被直接访问为 /css/style.css。
注意:不是所有路径都支持子目录嵌套的“自动映射”逻辑——但 /static 下的目录结构会 1:1 映射到 URL 路径,所以 /static/css/xxx.css → /css/xxx.css 是成立的。
为什么浏览器请求 /css/style.css 返回 404
常见原因不是路径放错,而是以下几点:
- 文件实际放在了
src/main/java或src/main/resources根目录(没进static) - IDE 没触发资源拷贝(如 IntelliJ 未勾选 “Build project automatically”,或 Maven 项目未启用 “Build on save”)
- 使用了自定义
WebMvcConfigurer却覆盖了默认静态资源配置,比如重写了addResourceHandlers但没调用super.addResourceHandlers(registry) - 加了
@EnableWebMvc—— 这个注解会完全关闭 Spring Boot 的自动配置,包括静态资源处理
如何验证 static 目录是否生效
最直接的办法是启动应用后,手动访问一个已知存在的静态文件 URL:
立即学习“前端免费学习笔记(深入)”;
假设你有 src/main/resources/static/css/demo.css,就打开浏览器访问 http://localhost:8080/css/demo.css。如果返回 200 和 CSS 内容,说明路径和配置都没问题;如果 404,再检查上面列出的几个点。
也可以临时加个测试接口确认 classpath 是否加载正确:
@RestController
public class StaticTestController {
@GetMapping("/test-static")
public String testStatic() {
return Optional.ofNullable(getClass().getClassLoader()
.getResource("static/css/demo.css"))
.map(URL::toString)
.orElse("NOT FOUND");
}
}
这个接口返回的 URL 如果包含 target/classes/static/css/demo.css,说明资源已编译进 classpath。
Thymeleaf 中引入 CSS 的写法要注意什么
如果你用 Thymeleaf 渲染 HTML,在模板里别写 <link href="css/style.css"> 这种相对路径——它依赖当前 URL 路径,容易出错。推荐用 Thymeleaf 的 @{...} 表达式:
<link th:href="@{/css/style.css}" rel="stylesheet">
这样能确保生成的是绝对路径 /css/style.css,不受页面路由影响。另外注意:th:href 不会做路径拼接,所以不能写成 @{css/style.css}(缺了开头的 /),否则可能变成 /user/css/style.css 这类错误路径。
如果用了 Spring Security,还要确认静态资源路径没被拦截。默认情况下 Spring Boot 2.7+ 的 Security 配置已放行 /** 下的静态资源,但如果手动配了 authorizeRequests(),得显式加上 .requestMatchers("/css/**", "/js/**", "/images/**").permitAll()。


















