Spring Boot静态资源访问和配置全解析

2023-10-31

 

原文

在web开发中,静态资源的访问时必不可少的,比如image、css、js等。SpringBoot对静态资源访问提供了很好的支持,使用其提供的基本默认配置基本可以满足开发需求,同时,又支持开发人员进行自定义配置。

一、默认静态资源映射规则

Spring Boot 默认将 / 所有访问映射到以下目录:**

classpath:/static
classpath:/public
classpath:/resources
classpath:/META-INF/resources
  • 1
  • 2
  • 3
  • 4

接下来,在main/resources下新建staticpublicresources三个文件夹,分别放入a.pngb.pngc.png三张图片,如下:
这里写图片描述
启动项目,分别访问:

http://localhost:8083/a.png
http://localhost:8083/b.png
http://localhost:8083/c.png
  • 1
  • 2
  • 3

发现都能正常访问相应的图片资源。那么说明,Spring Boot 默认会挨个从 publicresourcesstatic 里面找是否存在相应的资源,如果有则直接返回。

二、自定义静态资源映射规则

2.1 自定义静态资源映射类

追溯源码发现,在WebMvcAutoConfiguration类中,有如下代码:

public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if(!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
                CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
                if(!registry.hasMappingForPattern("/webjars/**")) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
                }
// 此处做的就是静态资源文件夹映射
                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));
                }

            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

通过追溯staticPathPattern,在ResourceProperties类中,发现如下常量信息被设置:

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
  • 1
  • 2

到此,就可以发现,这就是Spring Boot为我们提供的默认静态资源映射,那么自定义映射规则的话,继承WebMvcConfigurer即可。如下:

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 将/static/**访问映射到classpath:/mystatic/
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/mystatic/");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

main/resources下新建mystatic文件夹,并放入d.png图片。
启动项目,访问如下链接:
http://localhost:8083/static/d.png
发现,可以正常请求d.png图片。

2.2 在application.properties中进行配置

2.2.1 配置静态资源访问路径

application.properties中配置如下:

spring.mvc.static-path-pattern=/mystatic/**
  • 1

重启项目,再访问静态资源,需要以mystatic开头,如下:
http://localhost:8083/mystatic/a.png
这样,仍可以访问之前的a b c三张图片。如果按照之前http://localhost:8083/a.png就不能再访问到了。

2.2.2 配置静态资源目录

application.properties中,增加如下配置:

# 配置静态资源访问前缀
spring.mvc.static-path-pattern=/mystatic/**
# 配置静态资源路径,默认配置失效
spring.resources.static-locations[0]=classpath:/mystatic
spring.resources.static-locations[1]=classpath:/public
  • 1
  • 2
  • 3
  • 4
  • 5

重启项目,访问:
http://localhost:8083/mystatic/a.png
发现可以正常访问,同理,mystaticstatic中静态资源都可以正常访问。
但当访问resourcesstatic里静态资源时,就会404报错,访问不到了,这个是因为配置文件中如果进行了静态资源路径的配置,那么默认的配置就失效了。

好了,到此关于Spring Boot的静态资源访问和配置就介绍到这了,如有问题,欢迎留言~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot静态资源访问和配置全解析 的相关文章

  • SpringBoot通过HttpClient方式调用Restful接口

    前言 HttpClient相比于传统jdk自带的URLConnection 增加了易用性和灵活性 它不仅是客户端发送http请求变得容易 而且也方便了开发人员测试接口 提高了开发的效率 HttpClient是Apache Jakarta C
  • 图文:创建一个 idea + gradle + Springboot + MyBatis 项目

    最近项目用到了 springboot gradle 此文记录第一次使用 idea 创建 gradle springboot项目 部分参考网上资料 如有侵权 请联系我删除 1 new project gt spring initializr
  • 熬夜总结的2022java面试题

    java面试宝典 前言 java基础 什么是面向对象 值传递和引用传递 和equals的区别是什么 重载和重写的区别 抽象类和接口的区别 构造器 Constructor 是否可被 override java静态变量 代码块 和静态方法的执行
  • Springboot自定义ThreadPoolTaskExecutor线程池多线程并发执行异步方法

    1 背景 当前因为工作需求 要发送大量Http请求 经过实践遍历发送需要6小时才能发送完毕 如果单线程发送请求会导致主线程阻塞 就会存在以下问题 前端用户等待响应时间过长 无法进行下一步操作 不利于用户操作系统 响应时间过长超过Tomcat
  • IDEA中JDK的配置与Maven的配置详解

    1 在项目结构中配置JDK的版本 1 将Moudle SDK改为1 8 version 1 8 注 这是自己的SDK 而Project SDK是系统自带的SDK 不是自己的SDK 2 选择自己的1 8版本并配置好JDK主路径 2 在设置 构
  • Spring多定时任务@Scheduled执行阻塞问题

    一 问题描述 最近项目中发现一个问题 计划每日凌晨4 40执行一个定时任务 使用注解方式 Scheduled cron 0 40 4 cron表达式明显没有问题 但是这个定时任务总是不按时执行 有时候得等到8点多 有时候9点多才执行 后来查
  • JAVA学习路线,面试复习方向指引

    前言 好久没有沉下心学习一波了 总结了一份简单的java学习内容 包含java开发大概的技术栈 后续每个部分寻找一些面试题专项学习 本篇先写一个大概的知识概括 后面逐渐加内容 慢慢丰满 有一起学习的朋友欢迎交流 共同进步 学问须学 不学则殆
  • Vue+SpringMVC---前后端分离极简尝试

    前后端分离 的开发方式是目前WEB开发中的一个大的趋势 随着各种前后端框架的出现 加上REST编程规范慢慢深入人心 前端后端之间通过更加轻量级 简洁高效的JSON作为数据传输格式 使得一切变得开朗起来 前后端分工更加明晰 前端被赋予了更多的
  • 简单粗暴的分布式定时任务解决方案

    分布式定时任务 1 为什么需要定时任务 2 数据库实现分布式定时任务 3 基于redis实现 1 为什么需要定时任务 因为有时候我们需要定时的执行一些操作 比如业务中产生的一些临时文件 临时文件不能立即删除 因为不清楚用户是否操作完毕 不能
  • 如何通过JDBC连接远程服务端的数据库

    如何通过JDBC连接远程服务端的数据库 1 本地navicat链接到远程服务端 2 Myeclipse创建JDBC 1 本地navicat链接到远程服务端 首先 打开远程服务器 远程数据库中新建查询 输入SQL语句 表示允许任何主机访问数据
  • 解决Cannot resolve plugin org.apache.maven.plugins:maven-site-plugin:3.3问题

    在maven项目中遇到这个问题 判断是版本不一致问题 解决 打开设置 Build Execution Deployment Build Tools Maven 如下图 问题的原因出在 在该项目集成的maven和当前项目设置不统一 可能是之前
  • macOS安装Homebrew

    Homebrew官网 http brew sh index zh cn html 方式一 官网安装 Homebrew的安装很简单 mac自带ruby环境 只需在终端下输入如下指令即可完成Homebrew的安装 如果以下链接失效可以去官网看看
  • Java POI 百万规模数据的导入和导出

    目录 1 百万数据导入 1 1 需求分析 1 2 思路分析 1 3 代码实现 1 3 1 步骤分析 1 3 2 自定义处理器 1 3 3 自定义解析 1 3 4 测试 2 百万数据导出 2 1 概述 2 2 解决方案分析 2 3 原理分析
  • Java生成doc文档一(概念简介)

    在很多项目的实际工作中 后端可能需要将一些整合的数据输出成word pdf excel等形式的文档 最近我在项目也遇到这样的而需求 这里就记录下来是如何一步一步完成java后端生成doc文档的 由于现在word文档基本都是用到07以上 所以
  • Springboot 启动异常--ApplicationContextException: ...missing ServletWebServerFactory bean

    问题 不占用端口启动时 程序正常执行 下面为两种springboot启动方式 使用纯后台方式启动 不占用端口 springboot2 0以后的写法 new SpringApplicationBuilder sources Applicati
  • maven集成cucumber,mvn test单元测试不运行

    maven集成cucumber mvn test单元测试不运行 项目已集成cucumber jacoco测试覆盖率100 在application项目添加单元测试 覆盖率下降 发现单元测试覆盖的语句覆盖率没有统计到 经试验 发现是appli
  • JAVA 什么是多态?

    面向对象编程有三大特性 封装 继承 多态 封装隐藏了类的内部实现机制 可以在不影响使用的情况下改变类的内部结构 同时也保护了数据 对外界而已它的内部细节是隐藏的 暴露给外界的只是它的访问方法 继承是为了重用父类代码 两个类若存在IS A的关
  • 详解@Override注解

    目录 1 是什么 2 为什么用 3 举例说明 1 示例一 2 示例二 3 示例三 1 是什么 Override注解是伪代码 用于表示被标注的方法是一个重写方法 Override注解 只能用于标记方法 并且它只在编译期生效 不会保留在clas
  • 可能是把Docker的概念讲的最清楚的一篇文章

    编者的话 本文只是对Docker的概念做了较为详细的介绍 并不涉及一些像Docker环境的安装以及Docker的一些常见操作和命令 Docker是世界领先的软件容器平台 所以想要搞懂Docker的概念我们必须先从容器开始说起 如果你想和更多
  • 开源框架若依实战Demo学习笔记

    若依是个不错的框架 下面是我用他写的一个简单demo 以后会在此基础上进行进一步的开发 下面是整合的过程 我在整合的过程中可谓是一波三折 大家如果不想走弯路 那么这篇文章将对你很有帮助 首先 项目代码地址先列出来 方便大家下载使用 这是整理

随机推荐

  • Nginx(五)Nginx入门级配置与部署及“Hello World”

    转载自 http blog csdn net poechant article details 7049027 这一次我们要学习什么 就是用Nginx在一台机器上搭建一个最简单的显示 Hello World 的Web服务器 那我们就 ste
  • JavaScript设计模式(四)——策略模式、代理模式、观察者模式

    个人简介 个人主页 前端杂货铺 学习方向 主攻前端方向 正逐渐往全干发展 个人状态 研发工程师 现效力于中国工业软件事业 人生格言 积跬步至千里 积小流成江海 推荐学习 前端面试宝典 Vue2 Vue3 Vue2 3项目实战 Node js
  • 如何免费将本地服务映射到公网

    如何免费将本地服务映射到公网 内穿穿透原理解析 花生壳是一种基于 NAT 穿透的技术 可以让位于局域网内的设备通过一个公网 IP 地址访问互联网 具体来说 花生壳利用了 UDP 协议的特性 将内网设备的数据包通过一个中转服务器转发到公网上
  • Vue中缓存路由

    1 作用 让不展示的路由组件保持挂载 不被销毁 2 具体代码 2 1 缓存展示区所有组件
  • 服务器性能pdf,服务器性能计算方法.pdf

    一 数据库服务器性能计算需求分析 考虑到广州市公安局超级情报系统 SIS 设备升级项目的数据库 服务器的性能 我们建议采用主流的 T PC C值进行性能估算 TPC C 是一种旨在衡量联机事务处理 OLTP 系统性能与可 伸缩 性的行业标准
  • gcc make编译android,是用cmake编译openssl(支持android)

    openssl 首先openssl的源码 方案 这里用到了janbar的方案 且作者一直在更新 基本直接可以编译 设置到的主要的cmake文件 CMakeLists txt c rehash cmake crypto CMakeLists
  • Excel获取数值

    Excel获取数值篇 修复Cell getCellType方法过时问题 使用最新的类型方式获取 根据Excel单元格类型返回相对应的值 根据Excel单元格类型返回相对应的值 param cell return public static
  • NLP七十年!斯坦福教授Manning长文梳理

    作者 LRS 来源 新智元 从手工规则 神经网络到Transformer基础模型 自然语言处理的未来是统一多模态 走向通用人工智能 过去十年间 仅靠简单的神经网络计算 以及大规模的训练数据支持 自然语言处理领域取得了相当大的突破 由此训练得
  • vmware14 安装windows 11 注意事项

    1 正常创建虚拟机 系统选择window 10 x64 2 修改启动方式为UEFI 虚拟机设置 选项 高级 3 修改虚拟机配置 启用加密 虚拟机设置 选项 访问控制 启用加密 4 接下来正常安装即可 系统从微软官网下载
  • JedisPool链接未释放

    最近线上出现一个问题 一个接口一段时间后无响应 查看nginx日志499 502异常 zpp trade recharftenunt v1 qury HTTP 1 1 499 zpp trade recharftenunt v1 qury
  • 猫眼家APP广告变现:数据埋点在广告变现中的重要作用

    前言 数据埋点技术是一种收集用户行为数据并生成大量数据的方法 当用户在应用程序中执行操作时 代码会捕获并记录该操作 从而实现数据埋点 数据埋点对于实施APP广告变现策略至关重要 开发人员需要准确了解用户的行为习惯 兴趣和偏好 以提高广告变现
  • 基于Qt4+SQLite3的通信录

    首先申明 本文借鉴于 http blog csdn net jianchi88 article details 7052270 通信录实现的动能有 添加 查找 删除 但在页面效果上还不太美观 功能上没有去验证输入的信息的有效性 运行环境 u
  • 【FPGA零基础学习之旅#8】阻塞赋值与非阻塞赋值讲解

    欢迎来到FPGA专栏 阻塞赋值与非阻塞赋值 o o 嗨 我是小夏与酒 博客主页 小夏与酒的博客 该系列文章专栏 FPGA学习之旅 文章作者技术和水平有限 如果文中出现错误 希望大家能指正 欢迎大家关注 目录 阻塞赋值与非阻塞赋值 一 基础知
  • OceanBase 3.1.2版本测试报告

    测试场景 OLTP场景 测试工具使用的是开源版本BenchmarkSQL5 0 说明 我们已经通过修改源代码 实现了MySQL的支持 在单位进行分布式数据库POC选型时 都是使用该版本 集群拓扑及硬件配置信息 7台物理机 使用OBD直接部署
  • MySQL 中not in 查询为空

    MySQL not in踩坑 今天想用not in进行嵌套查询时 从逻辑上本应返回数据的结果却没有返回任何数据 查阅资料后找到原因 not in中 不能包含null值 如果包含null值 则直接返回空结果集 上代码
  • 计算二进制位"1"的个数

    写一个函数 返回数字中二进制位为 1 的个数 比如36 化为二进制得到100100 其中有2个 1 方法1 分别判断各个位 int bit count unsigned int n int count for count 0 n n gt
  • 最优服务次序问题(贪心法)

    最优服务次序问题 贪心法 问题描述 设有n个顾客同时等待一项服务 顾客i所需要的服务时间为ti 应如何安排顾客的服务次序 才能使平均等待时间最短 平均等待时间是n个顾客等待服务时间的总和除以n 解题思路 1 算法主要思想 本题我们直接采用贪
  • 【小白学习日记】如何使用matlab实现多矩阵排列组合

    matlab实现穷举法 今天在写程序时 需要实现一个穷举 即现有一个1 8的矩阵 第一个元素有四个值 第二到七个元素分别从0 1 1里面取值 要列出所有情况 即有8748种情况 在论坛上遇到一位提出利用ndgrid函数即可解决上述问题 原文
  • python关于字符串下面说法错误的是_Python计算机等级考试中易出错概念问题6(附答案),稳基,修炼,之,易错,含答案...

    1 关于Python对文件的处理 以下选项中描述错误的是 A Python能够以文本和二进制两种方式处理文件 B Python通过解释器内置的open 函数打开一个文件 C 当文件以文本方式打开时 读写按照字节流方式 D 文件使用结束后要用
  • Spring Boot静态资源访问和配置全解析

    一 默认静态资源映射规则 二 自定义静态资源映射规则 2 1 自定义静态资源映射类 2 2 在application properties中进行配置 2 2 1 配置静态资源访问路径 2 2 2 配置静态资源目录 原文 在web开发中 静态