首页 > 技术文章 > SpringBoot静态资源的访问

godzzz 2022-01-07 14:37 原文

默认情况下,也就是application.properties配置文件没有做任何配置,我们只需要将静态资源放在以下几个目录中,就可以直接通过url在浏览器中访问。

  • /META-INF/resources/
  • /resources/
  • /static/
  • /public/

注:请求地址中并不需要目录前缀,如果加上了反而多此一举会报 404 错误。因为 spring.mvc.static-path-pattern= ,默认值为 /**,且在路径映射(spring.resources.static-locations)中已经自动的添加上了目录前缀。

  

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

注:只能按优先级访问,无法指定访问某个目录下的重名文件。(在实际开发中,一般只会创建一个目录);文件名没有冲突的话,就会去挨个扫描目录去查找要访问的静态资源文件。

 

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/这四个目录了,还有这四个目录访问的优先级是怎么来的了。
 
 
修改静态资源映射的方法: 
  • 我们可以修改这两个属性来改变静态资源的映射,比如我们的所有静态资源都在mystatic目录中,并且我们希望访问静态资源的的url都带有/mystatic/这个目录前缀:
# 如设置为 /mystatic/* 的话只能匹配到第一层路径,是无法访问/mystatic/pages/目录下的资源;应改为 /mystatic/** 表示可以匹配任意层级的路径
spring.mvc.static-path-pattern=/mystatic/**
spring.resources.static-locations= classpath:mystatic/

  配置了指定的资源目录后,默认的资源目录则失效 (约定大于配置的思想,给他破坏掉)

  • 实现WebMvcConfigurer接口,并且重写addResourceHandlers方法就行,该操作与上面的方法得到的效果是一样的
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/aaa/");
    }
} 

注:上述两种方法同时配置的话,配置类会覆盖配置文件的配置。

 

SpringBoot访问templates目录下的html静态页面:

  实际开发中,html页面不建议放在static目录下,而是放在templates目录中。 一般使用spring boot默认为我们创建的static目录来放置css、图片、js等静态资源即可。但templates目录的资源默认是受保护的,没有开放访问权限。这是因为templates文件夹,是放置模板文件的,因此需要视图解析器来解析它。所以必须通过服务器内部进行访问,也就是要走控制器 → 服务 → 视图解析器这个流程才行。

   要访问templates目录下的html页面,还需要引入下面这个模板引擎,然后才能通过Controller来进行访问。

<!--访问静态资源-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

注:在使用模板引擎的时候,控制器不要用@RestController,因为它返回的是json数据格式,而我们要的是html页面。

 

thymeleaf 模板配置:

spring:
  #thymeleaf模板配置
  thymeleaf:
    cache: false                   # 这个开发配置为false,避免改了模板还要重启服务器
    prefix: classpath:/templates/  #模板文件视图前缀,默认是classpath:/templates/,可不用配置
    suffix: .html                  #模板文件视图后缀,默认是.html,可不用配置
    check-template-location: true  #检查模板位置,可不用配置
    encoding: utf-8                #编码字符集,默认为utf-8,可不用配置
    mode: HTML                     #模板的模式,默认为HTML,可不用配置
    servlet:
      content-type: text/html	   #模板的内容类型,默认为text/html,可不用配置

  

推荐阅读