Spring Boot静态资源必须放在classpath:/static、/public、/resources、/META-INF/resources四个路径下,其中仅/static支持目录结构1:1映射为URL路径,如static/css/style.css对应访问路径/css/style.css。

直接把 style.css 放进 src/main/resources/static/css/,然后在 HTML 里用 /css/style.css 路径引用——这是最稳、最不容易出错的方式。
静态资源必须放在哪几个路径下?
Spring Boot 只从 classpath 下这四个位置加载静态资源:
classpath:/static/classpath:/public/classpath:/resources/classpath:/META-INF/resources/
其中只有 /static/ 支持目录结构 1:1 映射为 URL 路径。比如你放 src/main/resources/static/css/style.css,浏览器就能直接通过 /css/style.css 访问;而放在 /resources/ 下的同名文件,URL 路径不会带 /css/ 前缀,必须平铺在根级才能访问,实用性差很多。
HTML 中怎么写 link 标签才有效?
两种写法都行,但行为和适用场景不同:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 纯静态写法:
<link href="/css/style.css" rel="stylesheet">—— 简单直接,适合 Thymeleaf、Freemarker、Beetl 等模板引擎,也兼容普通 HTML(只要没启用 Spring Security 拦截) - Thymeleaf 写法:
<link th:href="@{/css/style.css}" rel="stylesheet">—— 会自动处理上下文路径(比如部署在/myapp下时,生成/myapp/css/style.css),更适合生产环境多路径部署场景
注意:别写成 href="static/css/style.css" 或 href="./css/style.css",Spring Boot 不认 static 这个中间目录,相对路径在模板渲染后容易因请求路径变化而失效。
为什么 CSS 引入后没生效?常见原因有哪些?
不是路径错,就是被其他机制拦住了:
- Spring Security 默认拦截所有请求,包括
/css/**—— 必须在配置中放行:http.authorizeHttpRequests(auth -> auth.requestMatchers("/css/**", "/js/**", "/img/**").permitAll()) - 浏览器缓存了旧的 CSS 文件 —— 开发时可禁用缓存(F12 → Network → Disable cache),或给链接加版本参数:
<link href="/css/style.css?v=1.0.1" rel="stylesheet"> - 路径大小写不一致(尤其在 Linux 服务器上)——
/CSS/和/css/是两个不同路径,确保代码中路径与实际目录名完全一致 - 使用了自定义
spring.mvc.static-path-pattern却没同步调整 HTML 中的引用路径 —— 比如设成/assets/**,那 CSS 就得放在/static/css/,但引用必须写/assets/css/style.css
真正容易被忽略的是 Spring Security 的默认拦截行为——哪怕你路径全对、目录结构也规范,只要没显式放行静态资源路径,浏览器控制台就会静默报 403,连网络请求都看不到,排查起来特别费时间。

















