SpringBoot访问静态资源的配置及顺序说明
作者:zzzgd816 发布时间:2022-07-18 13:53:31
访问静态资源的配置及顺序
今天在玩SpringBoot的demo的时候,放了张图片在resources目录下,启动区访问的时候,突然好奇是识别哪些文件夹来展示静态资源的, 为什么有时候放的文件夹不能显示,有的却可以.
1. SpringBoot的默认配置
首先我们打开WebMvcAutoConfiguration类, 因为是静态资源的位置, 所以搜索location,找到这一行代码:
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
然后进入getStaticLocations这个方法,到了ResourceProperties类中的
public String[] getStaticLocations() {
return this.staticLocations;
}
这个方法,那接着看staticLocations这个属性,其实就到了这个类的顶部
public class ResourceProperties {
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 final ResourceProperties.Chain chain;
private final ResourceProperties.Cache cache;
public ResourceProperties() {
this.staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
this.addMappings = true;
this.chain = new ResourceProperties.Chain();
this.cache = new ResourceProperties.Cache();
}
...
}
可以看出,静态资源默认的位置是classpath,也就是resource目录下的:
/META-INF/resources
/resources
/static
/public
而且顺序就是数组的顺序.
2. 测试
我们创建一个index.html页面,然后<h1>标签分别是各自的路径,比如在/META-INF/resources下的index.html:
<!DOCTYPE html >
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>http-template</title>
</head>
<body>
<h1 >META-INF.resources</h1>
</body>
</html>
在上面四个文件夹中各自放一个不同标题的页面,启动springboot,访问localhost:8080
可以看到页面的标题是/META-INF/resources, 说明是按照上面的默认配置读取顺序读取的
注意,这里不需要加这个静态资源文件夹的名字!!,比如localhost:8080能看到页面,但是localhost:8080/static或localhost:8080/META-INF/resources是访问不了的
为了继续证实四个文件夹都可以,我放了同一个图片在各自文件夹,只是名字不同,结构如下:
访问
localhost:8080/2b.jpg
localhost:8080/3b.jpg
localhost:8080/4b.jpg
localhost:8080/5b.jpg
都能访问(不需要加静态资源文件夹的名字!!!), 反而是resource根目录,也就是classpath下的1b.jpg不能访问
3.配置
配置一: 是否可以访问静态资源
spring:
mvc:
static-path-pattern: /static/**
这个配置默认是/**, 表示的是正则匹配到这种路径才去访问静态资源,所以默认情况下,上面四个能够访问的路径也必须加上/zgd才可以访问
另一个需要注意的事,默认情况下访问index.html页面,不需要加这个文件名,比如localhost:8080,但是配置了该项后,需要文件名.localhost:8080/zgd/index.html
加上index.html资源全称后可以访问
配置二: 去哪找静态资源
这个配置就是我们上面说的那四个文件夹的配置了,注释掉上面的配置,启动看看
spring:
resources:
static-locations: classpath:/static/
启动访问localhost:8080
不出意料的显示的是static的标题,也就是static文件夹下的html文件.
此时尝试访问3b.jpg,4b.jpb都是无法访问的,只能访问2b.jpg
静态资源的配置心得
在springboot的application.properties中,下面2个配置是配置静态资源的。
# 默认值为 /**
spring.mvc.static-path-pattern=
# 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
spring.resources.static-locations=这里设置要指向的路径,多个使用英文逗号隔开
上面的那个是匹配规则,换句话说,只有静态资源满足什么样的匹配条件,Spring Boot才会处理静态资源请求。
下面的是匹配后指向的路径。也就是说 ,这个配置项是告诉springboot去哪找资源。
举例
spring.mvc.static-path-pattern=/gw/**
如果原先访问首页的地址是:http://localhost:8080/index.html,那么在你配置这个配置后,上面的访问就失效了,现在访问同样的页面需要这样访问:http://localhost:8888/gw/index.html
配置访问路径为/gw/后原本可以访问resources下其他文件夹的目录下的静态资源,现在不可以了。
比如下面截图中pay.html不能访问了,在没有配置为/static/可以通过http://localhost:8080/pay.html访问,注意地址栏。(测试时,spring.mvc.static-path-pattern=/static/**)
实际springboot项目,一般会将js、css等静态文件放在static下,而将页面放在templates下。
使用:
来源:https://zzzgd.blog.csdn.net/article/details/88686970


猜你喜欢
- 前言:Android Studio中把项目的lib库提交到Jcenter仓库中,需要使用到Bintray,Bintray是jCenter的提
- 一、首先编写一个工具类Hello:public class Hello { public static void say(Str
- 简介使用RecyclerView实现网格布局,实现手机界面应用列表 效果效果如下图: 详细代码XML布局文件在布局中使用
- 注意事项阿里云的dataworks提供了OpenApi, 需要是企业版或旗舰版才能够调用,也就是付费项目。这里测试主要是调用拉取datawo
- 本文实例为大家分享了flutter实现底部导航栏的具体代码,供大家参考,具体内容如下一.flutter底部导航栏常用组件BottomNavi
- 对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理
- 需求背景进击的Python随着人工智能的兴起,Python这门曾经小众的编程语言可谓是焕发了第二春。以tensorflow、pytorch等
- 这篇文章主要介绍了Java向上转型和向下转型实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息。但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证。
- 设计模式分类:创建型模式。结构型模式。行为模式。23种设计模式,如何记。面向对象的系统中有很多对象,创建型模式解决的问题就是如何创建对象,何
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- spring在启动时会自己把bean(java组件)注册到ioc容器里,实现控制反转,在开发人员使用spring开发应用程序时,你是看不到n
- 使用datatables自带后台查询 前台代码:<!DOCTYPE html><html><head>&
- 本文实例为大家分享了C#泛型类创建与使用的具体代码,供大家参考,具体内容如下using System;using System.Collec
- 首先说微信企业号的开发模式分为:编辑模式(普通模式)和开发模式(回调模式) ,在编辑模式下,只能做简单的自定义菜单和自动回复消息,要想实现其
- 前言大家都知道Android Studio目前已经更新到2.0 Preview 6了,作为Google大力推崇的开发工具,相对于Eclips
- Rsa加密RSA是目前最有影响力的公钥加密算法,RSA也是第一个既能用于数据加密也能用于数字签名的算法。该算法基于一个十分简单的数论事实:将
- 前言工作中使用mybatis时我们需要根据数据表字段创建pojo类、mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作
- 前言做APP应用开发的时候,用户头像肯定是必不可少的,但是90%以上的需求头像都是圆形的。那么,如何通过自定义View的方式实现圆形头像呢,
- 一.摘要emmmm..对springmvc不太熟练的情况下,如果不出意外的话,项目启动后出现404页面是很烦人。在这里,我记录一下可能会导致