SpringBoot访问静态资源的配置及顺序说明

目录
  • 访问静态资源的配置及顺序
    • 1. SpringBoot的默认配置
    • 2. 测试
    • 3.配置
  • 静态资源的配置心得
    • 举例

访问静态资源的配置及顺序

今天在玩SpringBoot的demo的时候,放了张图片在resources目录下,启动区访问的时候,突然好奇是识别哪些文件夹来展示静态资源的, 为什么有时候放的文件夹不能显示,有的却可以.

1. SpringBoot的默认配置

首先我们打开WebMvcAutoConfiguration类, 因为是静态资源的位置, 所以搜索location,找到这一行代码:

 String staticPathPattern = this.mvcProperties.getStaticPathPattern();
    if (!registry.hasMappingForPattern(staticPathPattern)) {
      this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
    }

然后进入getStaticLocations这个方法,到了ResourceProperties类中的

  public String[] getStaticLocations() {
    return this.staticLocations;
  }

这个方法,那接着看staticLocations这个属性,其实就到了这个类的顶部

public class ResourceProperties {
  private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
  private String[] staticLocations;
  private boolean addMappings;
  private final ResourceProperties.Chain chain;
  private final ResourceProperties.Cache cache;
  public ResourceProperties() {
    this.staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
    this.addMappings = true;
    this.chain = new ResourceProperties.Chain();
    this.cache = new ResourceProperties.Cache();
  }
...
}

可以看出,静态资源默认的位置是classpath,也就是resource目录下的:

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

而且顺序就是数组的顺序.

2. 测试

我们创建一个index.html页面,然后<h1>标签分别是各自的路径,比如在/META-INF/resources下的index.html:

<!DOCTYPE html >
<html>
<head lang="en">
    <meta charset="UTF-8" />
    <title>http-template</title>
</head>
<body>
<h1 >META-INF.resources</h1>
</body>
</html>

在上面四个文件夹中各自放一个不同标题的页面,启动springboot,访问localhost:8080

可以看到页面的标题是/META-INF/resources, 说明是按照上面的默认配置读取顺序读取的

注意,这里不需要加这个静态资源文件夹的名字!!,比如localhost:8080能看到页面,但是localhost:8080/static或localhost:8080/META-INF/resources是访问不了的

为了继续证实四个文件夹都可以,我放了同一个图片在各自文件夹,只是名字不同,结构如下:

访问

  • localhost:8080/2b.jpg
  • localhost:8080/3b.jpg
  • localhost:8080/4b.jpg
  • localhost:8080/5b.jpg

都能访问(不需要加静态资源文件夹的名字!!!), 反而是resource根目录,也就是classpath下的1b.jpg不能访问

3.配置

配置一: 是否可以访问静态资源

spring:
  mvc:
    static-path-pattern: /static/**

这个配置默认是/**, 表示的是正则匹配到这种路径才去访问静态资源,所以默认情况下,上面四个能够访问的路径也必须加上/zgd才可以访问

另一个需要注意的事,默认情况下访问index.html页面,不需要加这个文件名,比如localhost:8080,但是配置了该项后,需要文件名.localhost:8080/zgd/index.html

加上index.html资源全称后可以访问

配置二: 去哪找静态资源

这个配置就是我们上面说的那四个文件夹的配置了,注释掉上面的配置,启动看看

spring:
  resources:
    static-locations: classpath:/static/

启动访问localhost:8080

不出意料的显示的是static的标题,也就是static文件夹下的html文件.

此时尝试访问3b.jpg,4b.jpb都是无法访问的,只能访问2b.jpg

静态资源的配置心得

在springboot的application.properties中,下面2个配置是配置静态资源的。

# 默认值为    /**
spring.mvc.static-path-pattern=
# 默认值为   classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
spring.resources.static-locations=这里设置要指向的路径,多个使用英文逗号隔开

上面的那个是匹配规则,换句话说,只有静态资源满足什么样的匹配条件,Spring Boot才会处理静态资源请求。

下面的是匹配后指向的路径。也就是说 ,这个配置项是告诉springboot去哪找资源。

举例

spring.mvc.static-path-pattern=/gw/**

如果原先访问首页的地址是:http://localhost:8080/index.html,那么在你配置这个配置后,上面的访问就失效了,现在访问同样的页面需要这样访问:http://localhost:8888/gw/index.html

配置访问路径为/gw/后原本可以访问resources下其他文件夹的目录下的静态资源,现在不可以了。

比如下面截图中pay.html不能访问了,在没有配置为/static/可以通过http://localhost:8080/pay.html访问,注意地址栏。(测试时,spring.mvc.static-path-pattern=/static/**)

实际springboot项目,一般会将js、css等静态文件放在static下,而将页面放在templates下。

使用:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Boot 中的静态资源放置位置

    当我们使用 SpringMVC 框架时,静态资源会被拦截,需要添加额外配置,之前老有小伙伴在微信上问松哥Spring Boot 中的静态资源加载问题:"松哥,我的HTML页面好像没有样式?",今天我就通过一篇文章,来和大伙仔细聊一聊这个问题. SSM 中的配置 要讲 Spring Boot 中的问题,我们得先回到 SSM 环境搭建中,一般来说,我们可以通过 <mvc:resources /> 节点来配置不拦截静态资源,如下: <mvc:resources mappin

  • Spring boot 默认静态资源路径与手动配置访问路径的方法

    在application.propertis中配置 ##端口号 server.port=8081 ##默认前缀 spring.mvc.view.prefix=/ ## 响应页面默认后缀 spring.mvc.view.suffix=.html # 默认值为 /** spring.mvc.static-path-pattern=/** # 这里设置要指向的路径,多个使用英文逗号隔开,默认值为 classpath:/META-INF/resources/,classpath:/resources/,

  • 在SpringBoot中静态资源访问方法

    一.概述 springboot 默认静态资源访问的路径为:/static 或 /public 或 /resources 或 /META-INF/resources 这样的地址都必须定义在src/main/resources目录文件中,这样可以达到在项目启动时候可以自动加载为项目静态地址目录到classpath下 ,静态访问地址其实是使用 ResourceHttpRequestHandler 核心处理器加载到WebMvcConfigurerAdapter进行对addResourceHandlers

  • springboot中的静态资源加载顺序优先级

    目录 springboot静态资源加载顺序优先级 看springboot源码里面 springboot静态资源加载规则 一.静态资源映射规则 1.webjars 2.springboot内置默认访问路径 3.首页处理 4.网站图标 springboot静态资源加载顺序优先级 看springboot源码里面 springboot静态资源加载规则 我们经常会使用springboot创建web应用,在springboot中金静态资源是如何存放的呢? 一.静态资源映射规则 我们先创建一个springbo

  • SpringBoot访问静态资源的配置及顺序说明

    目录 访问静态资源的配置及顺序 1. SpringBoot的默认配置 2. 测试 3.配置 静态资源的配置心得 举例 访问静态资源的配置及顺序 今天在玩SpringBoot的demo的时候,放了张图片在resources目录下,启动区访问的时候,突然好奇是识别哪些文件夹来展示静态资源的, 为什么有时候放的文件夹不能显示,有的却可以. 1. SpringBoot的默认配置 首先我们打开WebMvcAutoConfiguration类, 因为是静态资源的位置, 所以搜索location,找到这一行代

  • springboot项目访问静态资源的配置代码实例

    这篇文章主要介绍了springboot项目访问静态资源的配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 这里只是简单记录当上传图片不是放在tomcat其他服务器中时,只是放在磁盘中便可以这样配置,在项目启动后可以访问到磁盘中的资源. @Configuration public class SystemConfigurer implements WebMvcConfigurer { @Value("${jeewx.path.uploa

  • springboot访问静态资源遇到的坑及解决

    目录 访问静态资源遇到的坑及解决 直接访问静态资源的问题 SpringBoot 默认静态资源访问配置 引入shiro 或 security后的拦截过滤 访问静态资源遇到的坑及解决 开始是以这种结构进行的,结果页面上一篇红,访问的页面是这样的 最终找出来问题,虽然每次调整路径都不对,最终查看多种方法可以看到了: 增加: package com.example.demo.config; import org.springframework.stereotype.Component; import o

  • 详解SpringBoot之访问静态资源(webapp...)

    springboot访问静态资源,默认有两个默认目录, 一个是  classpath/static 目录 (src/mian/resource) 一个是 ServletContext 根目录下( src/main/webapp ) 这在里可能有小伙伴对 classpath 不怎么了解,这里简要的介绍下,classpath 即WEB-INF下面的classes目录 ,在springboot项目中可能就是,src/main/resource 目录. 1,classpath 目录下-访问默认文件夹名为

  • 解决springboot 2.x 里面访问静态资源的坑

    目录 springboot 2.x 里面访问静态资源的坑 首先看一下 自动配置类的定义: 如果想要使用自动配置生效 SpringBoot2.x过后static下的静态资源无法访问 springboot 2.x 里面访问静态资源的坑 在spring boot的自定义配置类继承 WebMvcConfigurationSupport 后,发现自动配置的静态资源路径 classpath:/META/resources/,classpath:/resources/,classpath:/static/,c

  • IDEA配置静态资源热加载操作(Springboot修改静态资源不重启)

    第一步: 修改file->settings->compiler->build project automatically 第二步: 按ctrl+shift+a,搜索Registry双击进去,点击面板搜索running,勾选下面的值: 代码的热加载可以使用spring-boot-devtools,百度下就有很多,个人感觉不好用,修改代码需要重启项目,很烦,非常鸡肋,所以我不用,哈哈哈- 补充知识:idea实现修改html等springboot下static目录静态资源重新加载 对于前后端不

  • springboot操作静态资源文件的方法

    默认静态资源供 SpringBoot有几个默认的静态资源目录,当然也可配置,默认配置的/**映射到/static(或/public ,/resources,/META-INF/resources),自定义配置方式如下: spring.mvc.static-path-pattern=/** # Path pattern used for static resources. 前端如果需要访问默认的静态资源,下面有点要注意,考虑下面的目录结构: └─resources │ application.ym

  • Spring Boot访问静态资源css/js,你真的懂了吗

    一.前言 我们用 Spring Boot 搭建 Web 应用时(如搭建一个博客),经常需要在 Html 中访问一些静态资源,比如: css 样式: js 脚本: favicon.ico 图标等: 而在 Spring Boot 中如果没有做任何配置,是无法直接访问静态资源的,通常会报 404 错误: 二.Spring Boot 访问静态资源的默认目录 Spring Boot 访问静态资源,默认有两个默认目录: classpath/static 目录:src/mian/resource Servle

  • 使用springboot对外部静态资源文件的处理操作

    目录 springboot对外部静态资源文件的处理 1.存方面倒还简单,这里贴上一个获取微信临时素材并保存的方法 2.取,由于对springboot不熟悉,所以在这上面踩了坑 主要使用到这2个配置 之后,访问文件一直404 SpringBoot2.x静态资源访问 问题 代码 原理 springboot对外部静态资源文件的处理 springboot对外部资源文件的处理主要分为2部分,存和取,通过查看官方文件和看博客踩了坑之后终于搞定了,特此记录. 1.存方面倒还简单,这里贴上一个获取微信临时素材并

随机推荐