SpringBoot 之静态资源
boot 的默认的静态资源有多个, 由 ResourceProperties 配置了默认值:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
具体的配置工作是WebMvcAutoConfiguration的ResourceChainResourceHandlerRegistrationCustomizer完成的。
其先后顺序, 正是静态资源的查找顺序。 也就是说, 如果出现了多个同名的静态资源, 那么以 前面找到的为准。 假设下面的目录结构:
resources
META-INF
resources
subDir
aaaa.html
aa.html
lk.jsp
public
aa.html
resources
aa.html
static
aa.html
err.html
templates
aa.html
aaxx.html
errorrr.html
application.properties
我们访问 aa.html , 且假设没有 /aa或 /aa.html 的映射, 那么 META-INF.resources 下面的 aa.html 会被首先访问,其次是 resources目录下面的,再次是 static, 最后是 public。
这里的静态资源,可以是 html , js,css, pnp 等图片, pdf, excel , doc,ppt等,也甚至可以是jsp, 但是, 我测试过, 如果把jsp 当作静态资源,直接访问的话, 那么 浏览器是识别不了的,那么就会出现一个下载框(或者直接下载)。 总之,只要我们的请求路径是 上面RESOURCE_LOCATIONS 之一开头的,但是它和我们的配置,比如@RequestMapping,冲突了。 那么boot 优先使用 显式的@RequestMapping配置。
需要特别特别注意的是, 如果 静态资源的裸文件名,也就是文件去后缀后的文件名,如果 和某个 @RequestMapping 冲突了, 那么我们就无法直接访问这个 静态资源了!!!因为@RequestMapping 是可以忽略后缀匹配的。 这个时候,我们实际是访问了一个 @RequestMapping, 响应结果当然是由这个 方法来确定的。
boot, 当然也是额外提供了 对这个 静态资源位置的配置的:
spring.mvc.static-path-pattern= # 默认值为 /**
# 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
spring.resources.static-locations= 这里设置要指向的路径,多个使用英文逗号隔开,
使用 spring.mvc.static-path-pattern 可以重新定义pattern,如修改为 /myres/** ,则访问static 等目录下的fengjing.jpg文件应该为 http://localhost:8080/myres/fengjing.jpg ,修改之前为 http://localhost:8080/fengjing.jpg 。 spring.mvc.static-path-pattern 的格式必须是 xx/* xx/** /xx/* /xx/** , 我这里已经说的很明白了吧, 只有4种, 其实就两种, xx/* /xx/* 等价,是一个意思, 貌似boot 会自动给第一个路径补一个斜杠,如果没有的话(推荐使用斜杠开头的方式, 这样会让boot 少走一些“弯路”)。 而xx/* xx/** 的区别是, 一级目录,和多层级目录的区别了, 是 ant 目录格式。 当然, 我们也可以去掉星号,配置成 /xx /xx/yy, 这个是什么? 有些怪异了,我也迷糊了, 我也就不明白了。
注意 spring.mvc.static-path-pattern 只可以定义一个,目前不支持多个逗号分割的方式。
使用 spring.resources.static-locations 可以重新定义 pattern 所指向的路径,支持 classpath: 和 file: (上面已经做过说明) ,如果我们不写 classpath或file 前缀, 那么boot 是识别不了的!!! 而且呢, boot 也是不会报错的! 这个真的有些坑啊! 另外, 记住,配置 spring.resources.static-locations 的值的先后顺序就是查找的顺序!!
另外,spring.resources.static-locations还可以配置成空,坑!! 比如我不小心配置下面这个样, 结果boot 也生效了, 而且没报错!但这样之后我就访问不了任何静态资源了。。坑!!:
spring.resources.static-locations=
对静态文件的处理(主要是定位工作), 是org.springframework.web.servlet.resource.ResourceHttpRequestHandler 完成的。
ResourceHttpRequestHandler 完全是spring mvc 的范畴了。 它的作用就是找到那个url 对应的资源(通常是html/css/js之类的)然后检查是否被改变,如果未改变则直接返回304.改变则返回新内容。
除此之外, 我们可以编程方式添加 静态资源位置:
@Configuration
public class MyWebAppConfigurer
extends WebMvcConfigurerAdapter { @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/myres/**").addResourceLocations("classpath:/myres/");
super.addResourceHandlers(registry);
} }
参考:
http://blog.csdn.net/catoop/article/details/50501706
SpringBoot 之静态资源的更多相关文章
- SpringBoot 配置静态资源映射
SpringBoot 配置静态资源映射 (嵌入式servlet容器)先决知识 request.getSession().getServletContext().getRealPath("/& ...
- springboot设置静态资源不拦截的方法
springboot设置静态资源不拦截的方法 springboot不拦截静态资源需配置如下的类: import org.springframework.context.annotation.Confi ...
- springboot下静态资源的处理(转)
在SpringBoot中有默认的静态资源文件相关配置,需要通过如下源码跟踪: WebMvcAutoConfiguration-->configureResourceChain(method)-- ...
- IntelliJ IDEA+SpringBoot中静态资源访问路径陷阱:静态资源访问404
IntelliJ IDEA+SpringBoot中静态资源访问路径陷阱:静态资源访问404 .embody{ padding:10px 10px 10px; margin:0 -20px; borde ...
- springboot配置静态资源访问路径
其实在springboot中静态资源的映射文件是在resources目录下的static文件夹,springboot推荐我们将静态资源放在static文件夹下,因为默认配置就是classpath:/s ...
- 【SpringBoot】06.SpringBoot访问静态资源
SpringBoot访问静态资源 1.SpringBoot从classpath/static的目录 目录名称必须是static 启动项目,访问http://localhost:8080/0101.jp ...
- SpringBoot - 搭建静态资源存储服务器
目录 前言 环境 实现效果 具体实现 文件上传 配置类 上传接口 上传实现 辅助类 实体 上传测试 文件访问 配置类 项目源码 前言 记录下SpringBoot下静态资源存储服务器的搭建. 环境 wi ...
- springboot访问静态资源404
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- spring-boot配置静态资源映射的坑:properties文件不能添加注释
如此博文所述,Spring Boot 对静态资源映射提供了默认配置 默认将 /** 所有访问映射到以下目录:classpath:/staticclasspath:/publicclasspath:/r ...
- SpringBoot之静态资源放行
为了提高开发效率,编写对应的代码生成器.代码生成器主要有两个方面,一个是在线Web,另外一个是运行某个类. 使用的技术是SpringBoot+MyBatis-Plus+MySQL+JDK8. 在编写在 ...
随机推荐
- Zabbix4.0报警配置-企业微信报警
一:前期准备 1.1:企业号注册 https://qy.weixin.qq.com/ 微信调用接口说明 http://qydev.weixin.qq.com/wiki/index.php?title ...
- [HAOI2007]反素数
这道题其实就是求在 [1,n] 的区间内,那个数的约数个数最多,如果同样多,取最小... 那么我们只需要把质因数分解反过来做,然后更新答案就好了... 素数不需要筛出来,直接打表就好,因为只能用到几个 ...
- Centos下软件包管理
目录 一.安装软件包的三种方法 二.rpm包介绍 三.rpm工具用法 四.yum工具用法 五.yum搭建本地仓库 六.yum更换国内源 七.yum下载rpm包 八.源码包安装 九.扩展 一.安装软件包 ...
- wc语法2
wc命令的功能为统计指定文件中的字节数.字数.行数, 并将统计结果显示输出. 语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同 ...
- Linux系统-tcpdump常用抓包命令
主要语法 过滤主机/IP: tcpdump -i eth1 host 172.16.7.206 抓取所有经过网卡1,目的IP为172.16.7.206的网络数据 过滤端口: tcpdump -i e ...
- asp.net button控件 使用JS的 disabled
今天想用JS禁用asp.net的button控件,查了好久,都是一行代码.... document.getElementById("Button1").disabled ...
- h5 js判断是安卓还是ios设备,跳转到对应的下载地址
/*ios和安卓跳转 js*/$(function(){ var u = navigator.userAgent; var ua = navigator.userAgent.toLowerCase() ...
- Ubuntu16.04的sublime text3 的安装教程
1. sublime text3的官网位置 https://www.sublimetext.com/3 2.apt安装方式 1. 安装 GPG -key: wget -qO - https://do ...
- php最常见最经典的算法题
1.一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...
- insert 插入
自动关联当前时间: GETDATE():返回当前时间和日期.