SSM

SpringBoot静态资源的访问

2017-07-23  本文已影响6928人  lavor

SpringBoot静态资源的访问


在我们开发Web应用的时候,会用到大量的js、css、image、html等静态资源资源。

静态资源映射


默认情况下,我们只需要将静态资源放在一下几个目录中就可以直接通过url在浏览器中访问了。

如果这四个目录中有相同的静态资源文件,那么优先访问哪个目录下面的资源啊?
静态资源的默认访问优先级:/META-INF/resources/>/resources/>/static/>/public/

在四个目录中都放一个static.html的文件,每个html文件中都说明自己所在的目录,访问结果如下:


SpringBoot关于静态资源的访问涉及到了application.properties中的两个属性:

# 默认值为 /*
spring.mvc.static-path-pattern= #这里设置静态资源匹配的url-pattern
# 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ 
spring.resources.static-locations= #这里设置要指向的路径,多个使用英文逗号隔开,在前面的优先级高

此时,我们豁然开朗,知道默认情况下静态资源为什么放在/META-INF/resources//resources//static//public/这四个目录了,还有这四个目录访问的优先级是怎么来的了。

修改静态资源映射的方法:

spring.mvc.static-path-pattern=/mystatic/*
spring.resources.static-locations= classpath:mystatic/

resources资源目录中创建一个mystatic目录,在该目录下面创建一个static.html文件,访问结果如下:

注意:还可以设置外部磁盘目录,设置方式不变,格式如下:file:d/mystatic/

WebJars


WebJars将前端资源(css,js,image,html等等)打包到jar中,然后使用基于JVM的包管理器(比如 MavenGradle 等)管理前端依赖的方案。SpringBoot中也可以通过WebJars来访问静态资源。
SpringBoot默认将/webjars/**映射到 classpath:/META-INF/resources/webjars/

所以默认情况下我们需要访问WebJars中的资源,需要将其jar包放到classpath:/META-INF/resources/webjars/目录中。
我们来使用一下WebJars:

 <dependency>
      <groupId>org.webjars</groupId>
      <artifactId>jquery</artifactId>
      <version>2.1.1</version>
  </dependency>
<script src="/webjars/jquery/2.1.1/jquery.js"></script>

版本号统一管理


如果我们有很多页面都是用了WebJars中的资源,而我们现在要升级WebJars的版本,岂不是要在每个页面中都改动一下,这样很麻烦啊,有没有简单的方法啊。此时,我们可以进行版本号统一管理。

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>webjars-locator</artifactId>
        </dependency>
<script src="/webjarslocator/jquery/jquery.js"></script>

静态资源版本管理


当我们资源内容发生变化时,由于浏览器缓存,用户本地的静态资源还是旧的资源,为了防止这种情况导致的问题,我们可能会手动在请求url的时候加个版本号或者其他方式。

<script type="text/javascript" src="/lavor.js?v=1.1"></script>

SpringMVC提供了两种方式可以帮助我们很容易地解决这类问题。

MD5方式


spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
<script  src="${urls.getForLookupPath('/lavor.js') }"></script>
<script  src="/lavor-fdfa0502716d517c6cad4f2536aa02a1.js"></script>

请求/lavor-fdfa0502716d517c6cad4f2536aa02a1.js,我们MD5配置的paths=/**,所以SpringMVC会尝试url中是否包含-,如果包含会去掉后面这部分,然后去映射的目录(如webapp根目录,上面提到的四大静态映射目录)查找/lavor.js文件,如果能找到就返回。

版本号方式


spring.resources.chain.strategy.fixed.enabled=true
#版本号处理的路径
spring.resources.chain.strategy.fixed.paths=/**
# 版本号,可以为所处理路径中的资源加上/v1.1目录前缀
spring.resources.chain.strategy.fixed.version=v1.1
<script  src="${urls.getForLookupPath('/lavor.js') }"></script>
<script  src="/v1.1/lavor.js"></script>

请求/v1.1/lavor.js,会查看v1.1是不是版本号,如果是就去掉前缀目录,直接查找/lavor.js

注意:我们发现如果添加了webapp目录,那么该目录也可以存放静态资源,并且默认情况下访问优先级比/META-INF/resources/还要高。

上一篇下一篇

猜你喜欢

热点阅读