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. python类属性和类方法(类的结构、实例属性、静态方法)

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  2. ACM-ICPC 2018 南京赛区网络预赛B

    题目链接:https://nanti.jisuanke.com/t/30991 Feeling hungry, a cute hamster decides to order some take-aw ...

  3. 如何ASP.NET Core Razor中处理Ajax请求[转载]

    在ASP.NET Core Razor(以下简称Razor)刚出来的时候,看了一下官方的文档,一直没怎么用过. 今天闲来无事,准备用Rozor做个项目熟练下,结果写第一个页面就卡住了..折腾半天才搞好 ...

  4. oracle 链接

    <properties> <!--配置Hibernate方言 --> <property name="hibernate.dialect" value ...

  5. [Spring Boot]什么是Spring Boot

    <Spring Boot是什么> Spring Boot不是一个框架 是一种用来轻松创建具有最小或零配置的独立应用程序的方式 用来开发基于Spring的应用,但只需非常少的配置. 它提供了 ...

  6. 本地sh脚本创建以及利用ssh server远程运行sh脚本

    想要同时运行多个非本地的sh脚本,用来实现运行同一网段下多机程序的集成,可以通过在每台机器上写sh脚本,再在本机上运行一个启动远程机器sh的脚本 首先需要在所有机器上安装openssh-server ...

  7. webapp 安卓 ios 兼容性问题

    1.ios js中时间不兼容YYYY-MM-DD这种格式的时间,只支持YYYY/MM/DD这种格式 // 在safari中new Date('2018-09-02') // Invalid Daten ...

  8. [转]Haproxy原理(1)

    本文出处:https://www.cnblogs.com/skyflask/p/6970151.html 目录 一.四层和七层负载均衡的区别二.HAProxy与LVS的异同三.快速安装HAProxy集 ...

  9. web(六)css的基本语法、取值与单位

    css语法包含如下部分: 选择器:用于选择需要添加样式的元素. 属性(property):样式的属性名称,例如color代表颜色. 取值与单位:属性对应的值以及单位. 语法规则:css的某些固定语法. ...

  10. 第七十九课 最短路径(Floyd)

    程序如下: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" #include "SharedPointer.h&q ...