Spring Boot 静态资源映射

默认的静态资源目录

Spring Boot 中,默认的静态资源目录如下:

优先级(数字越小优先级越高) 类路径位置(在/src/main/resources/中对应的目录 说明
1 classpath:/META-INF/resources/ 常用于 WebJars,放在/META-INF/resources/下的文件会被直接映射。
2 classpath:/resources/ 与/src/main/resources/resources/对应,适合放置不想放在static、public的资源。
3 classpath:/static/ 最常用的静态资源目录,放在/src/main/resources/static/下的文件会映射到根路径(/**)。
4 classpath:/public/ 与static类似,放在/src/main/resources/public/下的文件同样可直接访问。

这些路径在 Spring Boot 3.x 中,由org.springframework.boot.autoconfigure.web.WebProperties.Resources.CLASSPATH_RESOURCE_LOCATIONS定义。


访问示例

文件实际路径 访问 URL
/src/main/resources/META-INF/resources/index.html http://localhost:8080/index.html
/src/main/resources/META-INF/resources/1/index.html http://localhost:8080/1/index.html
/src/main/resources/resources/index.html http://localhost:8080/index.html
/src/main/resources/resources/2/index.html http://localhost:8080/2/index.html
/src/main/resources/static/index.html http://localhost:8080/index.html
/src/main/resources/static/3/index.html http://localhost:8080/3/index.html
/src/main/resources/public/index.html http://localhost:8080/index.html
/src/main/resources/public/4/index.html http://localhost:8080/4/index.html

相关说明

  1. 不需要在 URL 中填写静态资源目录(如/META-INF/resources/、/resources/、/static/、/public/),Spring Boot 会自动把根路径映射到这些目录;

  2. 优先级:如果同名资源出现在多个目录,按/META-INF/resources/ -> /resources/ -> /static/ -> /public/的顺序决定最终返回的文件;

  3. 自定义:如果想改动默认位置,可在application.properties(或application.yml或application.yaml)中配置spring.web.resources.static-locations,该配置会覆盖默认值,也就是上述默认的静态资源目录将失效(由于 Spring Boot 的兜底机制,部分目录依然有效,具体说明见5),需要在该配置项显式配置,优先级也由该配置的顺序决定(越靠前优先级越高);

  4. 欢迎页(index.html):放在上述任意目录的根路径下,会被自动识别为默认首页;

  5. 由于 Spring Boot 的兜底机制,即便spring.web.resources.static-locations置空,或配置的自定义路径,没有配置上述的默认静态资源目录,其它默认配置会失效,/META-INF/resources/还是有效的,相当于会自动在该配置最后添加/META-INF/resources/,可通过配置spring.web.resources.add-mappings=false关闭兜底机制。


默认配置相关代码

org.springframework.boot.autoconfigure.web.WebProperties.Resources.CLASSPATH_RESOURCE_LOCATIONS相关源码如下:

java 复制代码
@ConfigurationProperties("spring.web")
public class WebProperties {
    // ...
    public static class Resources {
        private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
        private String[] staticLocations;
        private boolean addMappings;
        private boolean customized;
        private final Chain chain;
        private final Cache cache;

        public Resources() {
            this.staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
            this.addMappings = true;
            this.customized = false;
            this.chain = new Chain();
            this.cache = new Cache();
        }

        public String[] getStaticLocations() {
            return this.staticLocations;
        }

        public void setStaticLocations(String[] staticLocations) {
            this.staticLocations = this.appendSlashIfNecessary(staticLocations);
            this.customized = true;
        }
        // ...
    }
    // ...
}
相关推荐
高频因子挖掘机3 小时前
只取最近 60 个交易日,却每次拉全历史:量化脚本变慢的原因与改法
后端·github·api
孟健4 小时前
从5000亿Token到83%字节匹配:AI逆向工程与重构的工程闭环实践
后端·架构·ai编程
paopaokaka_luck4 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
SL_staff4 小时前
JVS混合架构实践:能力引擎+动态模型如何支撑企业级可持续交付
spring boot·低代码·全栈
码事漫谈4 小时前
丢得静悄悄,谈一谈 Agent 的记忆是怎么没的
后端
迪飞特科技4 小时前
智慧物业平台实战:Spring Boot 整合小程序实现报修巡检费用全流程
spring boot·后端·小程序
考虑考虑4 小时前
@JsonInclude注解使用
spring boot·后端·spring
IT_陈寒5 小时前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端
网易云信5 小时前
大模型能上岗做销售吗?我们让 12 款国产模型交了 420 份作业
前端·后端
CCblandy5 小时前
HTTP 长连接 3 类故障实测:[WinError 10053]、99 个 TIME_WAIT、69 次多余握手,4 种对策怎么选
后端·python·网络协议·http·云原生·性能优化·架构