SpringBoot之静态资源访问

本文介绍了SpringBoot中静态资源的多种访问方式,包括默认文件夹和自定义文件夹的使用方法。通过源码解析了静态资源访问的原理及优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot之静态资源访问

1.springboot访问静态资源的几种方式
(1)在src/main/resources/目录下创建
static文件夹
(2)在src/main/resources/目录下创建
resources文件夹
(3)在src/main/resources/目录下创建
public文件夹
(4)在src/main/resources/目录下创建
META-INF/resources文件夹
目录结构图:
这里写图片描述
访问方式:
这里写图片描述
不知道大家看到这里有没有注意我的目录结构在4个文件夹中我们都拥有相同名字的6.jpg图片,那么在springboot在这种特殊的情况访问的顺序是怎样的呢,优先级顺序/META-INF/resources>resources>static>public,感兴趣的可以自己试一下
看到这里我们会不会有一个疑问难道在springboot中我们想访问静态资源的时候必须以springboot创建指定名称文件夹来访问么,当然不是,下面向大家分享一个自定义文件夹访问静态资源的方式
(1):首先创建一个java类
这里写图片描述
创建一个java类继承WebMvcConfigurerAdapter类并且重写addResourceHandlers方法,参数引用ResourceHandlerRegistry类这个对象调用addResourceHandler以及addResourceLocations方法,从俩个方法名我们不难看出前者是提供资源访问路径而后者是本地项目路径,那到底是什么意思呢?下面举例说明一下:
这里写图片描述
这里写图片描述
从上面俩张图片大家可以看出本地项目目录对应的就是addResourceLocations这个方法中传递的url参数,addResourceHandler方法就是资源访问url,在我们访问test/4.jpg时springboot会为我们在本地项目中找到testpicture这个文件夹中的4.jpg

看完自定义访问静态资源不知道大家有没有猜到为什么springboot可以访问/META-INF/resources,resources,static,public这4个文件夹下的静态资源,并且直接访问图片名称即可。下面我们来看一下springboot中的源码:
(1)打开WebMvcAutoConfiguration类找到addResourceHandlers方法:
这里写图片描述
从图中我们可以看到首先将变量staticPathPattern赋值然后将获取的值赋给资源访问路径方法,下面我们看一下staticPathPattern的值为什么
(2)打开WebMvcProperties类我们可以找到以下代码:
这里写图片描述
从图中我们可以看到值为/**这也就解释了为什么springboot在访问静态资源的时候只访问资源啊名称即可。
(3)下面我们继续查看WebMvcAutoConfiguration类:
这里写图片描述
(4)打开ResourceProperties类我们可以看到以下俩段代码:
这里写图片描述
这里写图片描述
在CLASSPATH_RESOURCE_LOCATIONS[] 这个数组中我们可以看到
“classpath:/META-INF/resources/”, “classpath:/resources/”, “classpath:/static/”, “classpath:/public/”这4个属性,这就解释了为什么springboot可以直接访问1./META-INF/resources 2.resources 3.static 4.public这4个文件夹下的静态资源

<think>好的,我现在需要解决用户在Spring Boot中遇到的静态资源404无法访问的问题。首先,我得回忆一下Spring Boot处理静态资源的默认配置。根据引用[4],默认的静态资源路径是classpath下的/META-INF/resources/、/resources/、/static/和/public/这几个目录。用户如果按照约定把资源放在这些位置,应该可以自动访问,但出现404说明有问题。 可能的原因之一是路径冲突。比如用户可能自定义了资源处理器,但没有正确配置,导致覆盖了默认的设置。比如引用[3]中的例子,用户自定义了addResourceHandlers方法,但调用super.addResourceHandlers(registry)可能会导致路径被覆盖,所以需要检查是否存在这种情况。应该建议用户检查是否有自定义的WebMvcConfigurer,特别是是否调用了父类的方法或者重复注册了资源处理器。 第二个可能性是静态资源的位置不符合默认约定。用户可能把资源放在了非标准目录下,比如src/main/webapp,这时候需要确认是否启用了webapp目录的支持,如引用[2]提到的,需要添加/到资源路径中,或者在配置中明确指定该目录。 另外,缓存问题也可能导致资源无法加载。建议用户尝试清除浏览器缓存或者禁用缓存,尤其是在开发环境中,可能需要配置spring.resources.cache.period为0来禁用缓存。 还有可能用户没有正确使用模板引擎,比如Thymeleaf,导致静态资源路径引用错误。根据引用[5],如果使用Thymeleaf,应该使用th:href或th:src来正确引用资源,比如href="/css/style.css"可能需要改为th:href="@{/css/style.css}"。 另外,检查是否配置了正确的静态资源前缀。例如,如果应用部署在上下文路径下,比如http://localhost:8080/myapp/,那么静态资源的路径应该是/myapp/css/style.css,而不仅仅是/css/style.css。需要确认是否配置了server.servlet.context-path,并在前端正确引用。 还有可能是安全配置拦截了静态资源请求,比如Spring Security的配置中可能没有放行静态资源路径。需要检查Security配置,确保静态资源路径允许匿名访问。 最后,用户可能没有正确放置资源文件,比如文件位置错误或者文件名拼写错误,需要确认资源文件的实际存放路径是否与访问路径匹配。 总结下来,解决方案包括检查资源存放位置、验证自定义配置是否正确、处理缓存问题、使用正确的模板引擎标签、配置上下文路径、检查安全设置以及确认文件路径和名称的正确性。需要一步步引导用户排查这些可能性,找到具体原因并对应解决。</think>关于Spring Boot静态资源404问题的解决方案,可通过以下步骤排查: ### 一、检查默认静态资源路径 1. **确认资源存放位置** Spring Boot默认静态资源目录为: - `classpath:/META-INF/resources/` - `classpath:/resources/` - `classpath:/static/` - `classpath:/public/` 确保资源文件存放在以上目录中(如`src/main/resources/static/css/style.css`)[^4]。 2. **验证默认访问路径** 默认访问路径为`http://localhost:8080/css/style.css`,**无需**添加`/static`前缀[^2]。 --- ### 二、排查自定义配置冲突 3. **检查`WebMvcConfigurer`配置** 若自定义了`addResourceHandlers`方法,需避免覆盖默认配置: ```java @Configuration public class MvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/custom/**") .addResourceLocations("classpath:/custom-static/"); // 不要调用 super.addResourceHandlers(registry) [^3] } } ``` 4. **验证`spring.resources.static-locations`配置** 在`application.properties`中,若自定义该属性会**完全覆盖默认路径**,需保留默认路径: ```properties spring.resources.static-locations=classpath:/static/,classpath:/custom-static/ ``` --- ### 三、处理常见特殊场景 5. **Webapp目录资源访问** 若资源存放在`src/main/webapp`目录,需在配置中显式添加路径: ```java registry.addResourceHandler("/**") .addResourceLocations("/"); ``` 6. **模板引擎路径引用** 使用Thymeleaf时,需通过语法`th:href="@{/css/style.css}"`正确引用资源[^5]。 --- ### 四、清除缓存与调试 7. **禁用资源缓存** 在开发环境添加配置: ```properties spring.resources.cache.period=0 ``` 8. **检查浏览器控制台** 通过浏览器开发者工具查看: - 资源请求URL是否正确 - 响应状态码是否为404以外的错误(如403可能涉及安全拦截) --- ### 五、其他可能性 9. **上下文路径(Context Path)影响** 若配置了`server.servlet.context-path=/myapp`,访问路径应为`http://localhost:8080/myapp/css/style.css`。 10. **文件权限问题** 确保资源文件未被IDE或操作系统锁定,且构建时文件已复制到`target/classes`目录。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值