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 之静态资源的更多相关文章

  1. SpringBoot 配置静态资源映射

    SpringBoot 配置静态资源映射 (嵌入式servlet容器)先决知识 request.getSession().getServletContext().getRealPath("/& ...

  2. springboot设置静态资源不拦截的方法

    springboot设置静态资源不拦截的方法 springboot不拦截静态资源需配置如下的类: import org.springframework.context.annotation.Confi ...

  3. springboot下静态资源的处理(转)

    在SpringBoot中有默认的静态资源文件相关配置,需要通过如下源码跟踪: WebMvcAutoConfiguration-->configureResourceChain(method)-- ...

  4. IntelliJ IDEA+SpringBoot中静态资源访问路径陷阱:静态资源访问404

    IntelliJ IDEA+SpringBoot中静态资源访问路径陷阱:静态资源访问404 .embody{ padding:10px 10px 10px; margin:0 -20px; borde ...

  5. springboot配置静态资源访问路径

    其实在springboot中静态资源的映射文件是在resources目录下的static文件夹,springboot推荐我们将静态资源放在static文件夹下,因为默认配置就是classpath:/s ...

  6. 【SpringBoot】06.SpringBoot访问静态资源

    SpringBoot访问静态资源 1.SpringBoot从classpath/static的目录 目录名称必须是static 启动项目,访问http://localhost:8080/0101.jp ...

  7. SpringBoot - 搭建静态资源存储服务器

    目录 前言 环境 实现效果 具体实现 文件上传 配置类 上传接口 上传实现 辅助类 实体 上传测试 文件访问 配置类 项目源码 前言 记录下SpringBoot下静态资源存储服务器的搭建. 环境 wi ...

  8. springboot访问静态资源404

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  9. spring-boot配置静态资源映射的坑:properties文件不能添加注释

    如此博文所述,Spring Boot 对静态资源映射提供了默认配置 默认将 /** 所有访问映射到以下目录:classpath:/staticclasspath:/publicclasspath:/r ...

  10. SpringBoot之静态资源放行

    为了提高开发效率,编写对应的代码生成器.代码生成器主要有两个方面,一个是在线Web,另外一个是运行某个类. 使用的技术是SpringBoot+MyBatis-Plus+MySQL+JDK8. 在编写在 ...

随机推荐

  1. sql多表查询(单表查询略过)

    表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...

  2. Java语法基础学习DaySeventeen(多线程续)

    一.线程的特点 1.线程的分类 java中的线程分为两类:守护线程和用户线程.唯一的区别是判断JVM何时离开. 守护线程是用来服务用户线程的,通过在start()方法前调用Thread.setDaem ...

  3. makefile简单学习

    前言 在C语言中,我们需要将源代码生成可执行的程序.这里面其实要经过非常多的步骤.参看下图: 这中间主要通过make命令,读取一种名为“makefile”或“Makefile”的文件来实现软件的自动化 ...

  4. 网络编程 生产者消费者模型 GiL

    守护进程: 注意事项: 1.必须在p.start()前 2.守护进程不能开子进程 3.如果主进程的运行时间快于子进程,那么就只有主进程的结果,没有守护进程的结果,因为守护进程没有进行完.反之会得到两个 ...

  5. Python 实现简易 Shell

    什么是shell? (1)shell是一个系统软件,负责用户和操作系统内核之间的交互,是产生进程的进程(通过linux系统调用fork,exec),主要负责解释用户的命令,进而实现用户对进程的控制. ...

  6. [ 随手记 1 ] C/C++宏,普通函数,内联函数

    函数定义 C 语言中的函数定义的一般形式如下: return_type function_name( parameter list ) { body of the function } 在 C 语言中 ...

  7. Js强制转换

    Js强制转换 ParseInt(a,b):整型 只能放字符串,b为基数.声明前面的数是几进制.因为只能放字符串,所以无论放什么都转换为字符串: 如果String以0x开头则为16进制的整数: ‘036 ...

  8. 深入学习Motan系列(四)—— 客户端

    困惑的袋鼠,对框架的把握有些茫然,但是仍然一步步向前,行动总比一直迷茫停止不前要好,您说呢,各位客官? 这篇开始客户端的分析.有些地方的代码,就不每段都标出了,中间有跳跃的地方,请自己对照代码来看.鄙 ...

  9. python socket 函数介绍

    socket 函数原型:socket.socket([family[,type[,proto]]]) family参数取值(协议族): socket.AF_INET        -->ipv4 ...

  10. 【SpringBoot】搜索框架ElasticSearch介绍和整合SpringBoot

    ========================12章 搜索框架ElasticSearch介绍和整合SpringBoot ============================= 加入小D课堂技术交 ...