Spring Boot引入static目录下CSS不生效如何解决
问题根源
Spring Boot 对类路径下的静态资源有默认映射规则,resources/static、resources/public、resources/META-INF/resources这几个目录下的文件,会被直接映射到服务根路径/下,也就是说你放在resources/static/css/ss.css的文件,实际访问地址是http://服务地址/css/ss.css,路径里不需要带/static前缀。
你写的link标签同时配置了原生href和Thymeleaf的th:href属性,样式不生效基本都是配置、路径、拦截规则的问题,按下面的步骤逐一排查即可。
排查解决步骤
- 先确认目录结构正确
静态文件必须放在Spring Boot能扫描到的位置,标准目录结构如下:
不要把static目录放到resources外层、或者webapp等其他未被默认配置扫描的路径下。src └── main └── resources ├── static │ └── css │ └── ss.css └── templates └── 你的页面文件.html - 检查是否覆盖了默认静态资源映射规则
如果你自定义过Spring MVC相关配置,默认的静态资源映射会失效:- 如果在
application.yml/application.properties中修改过静态路径匹配规则,比如配置了spring.mvc.static-path-pattern=/res/**,那Thymeleaf中引入路径要对应改成@{/res/css/ss.css} - 如果写了配置类继承
WebMvcConfigurationSupport,必须手动重写资源映射方法,把static目录加进去:@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/"); // 其余自定义映射规则可在后方追加 }
- 如果在
- 确认Thymeleaf配置正常
首先页面的html根标签必须加上Thymeleaf命名空间,否则th属性不会被引擎解析:
其次Thymeleaf页面必须放在<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">resources/templates目录下,通过控制器路由跳转访问,不能直接本地双击打开html文件——本地打开时Thymeleaf引擎不工作,浏览器只会读取你写的原生href="../static/css/ss.css"相对路径,必然会404。
标签里多余的原生href属性可以直接删掉,正确的引入写法只保留th:href即可:<link th:href="@{/css/ss.css}" rel="stylesheet" /> - 检查是否有拦截器/安全框架拦截静态资源
如果项目集成了Spring Security、或者自定义了拦截器,必须把静态资源路径设为放行,否则请求css文件时会被拦截返回302/403,样式无法加载。以Spring Security为例,放行配置如下:@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth .requestMatchers("/css/**", "/js/**", "/images/**").permitAll() // 其余拦截规则可在后方追加 ); return http.build(); } - 清理缓存重试
很多时候是IDE编译缓存未更新,target/classes目录下没有同步最新的css文件,执行mvn clean命令、或者在IDE中选择Rebuild Project,同时清空浏览器缓存后重启服务再访问即可。
内容的提问来源于stack exchange,提问作者Богдан Харашук
相关产品推荐
相关产品推荐

