SpringBoot的static静态资源访问、参数配置、代码自定义访问规则

news2024/11/17 7:22:21

目录

  • 1. 静态资源
    • 1.1 默认静态资源
    • 1.2 Controller高优先级
    • 1.3 修改静态资源的URL根路径
    • 1.4 修改静态资源的目录
    • 1.5 访问webjars依赖包的静态资源
    • 1.6 静态资源的关闭
    • 1.7 静态资源在浏览器的缓存
    • 1.8 静态资源实战
    • 1.9 通过代码自定义静态资源访问规则

1. 静态资源

查看源码如下:

package org.springframework.boot.autoconfigure.web.servlet;
......省略部分......
public class WebMvcAutoConfiguration {
......省略部分......
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                // 将静态资源映射,都添加到映射中心
                this.addResourceHandler(registry, this.mvcProperties.getWebjarsPathPattern(), "classpath:/META-INF/resources/webjars/");
                this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
                    registration.addResourceLocations(this.resourceProperties.getStaticLocations());
                    if (this.servletContext != null) {
                        ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
                        registration.addResourceLocations(new Resource[]{resource});
                    }

                });
            }
        }
......省略部分......
        private void addResourceHandler(ResourceHandlerRegistry registry, String pattern, Consumer<ResourceHandlerRegistration> customizer) {
            if (!registry.hasMappingForPattern(pattern)) {
                ResourceHandlerRegistration registration = registry.addResourceHandler(new String[]{pattern});
                customizer.accept(registration);
                registration.setCachePeriod(this.getSeconds(this.resourceProperties.getCache().getPeriod()));
                registration.setCacheControl(this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl());
                registration.setUseLastModified(this.resourceProperties.getCache().isUseLastModified());
                this.customizeResourceHandlerRegistration(registration);
            }
        }
......省略部分......
}

1.1 默认静态资源

默认的静态资源目录为:resources/META-INF/resources、resources/public、resources/resources、resources/static。一般用于存放图片、视频、css、js文件

默认的访问静态资源的URL根路径为:/**

所以访问resources/META-INF/resources/baidu1.jpg的URL为http://localhost:8080/baidu1.jpg

1.2 Controller高优先级

如果一个Controller的的@RequestMapping定义的访问路径,和静态资源的URL访问路径一样,则返回Controller的内容

1.3 修改静态资源的URL根路径

可以通过配置参数: spring.mvc.static-path-pattern: /static/**,修改静态资源的URL根路径。此时访问resources/META-INF/resources/baidu1.jpg的URL为http://localhost:8080/static/baidu1.jpg

1.4 修改静态资源的目录

可以通过配置参数:spring.web.resources.static-locations: [classpath:/my-resources/],修改静态资源的目录。会使resources/public、resources/resources、resources/static目录失效,但resources/META-INF/resources目录不失效

1.5 访问webjars依赖包的静态资源

会自动将resources/META-INF/resources/webjars/**,作为静态资源目录

这里我们以jquery为例,进行讲解。在pom.xml添加如下依赖

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.6.1</version>
        </dependency>

org.webjars.jquery的jar包的目录结构如下:
jquery的jar包的目录结构
然后访问http://localhost:8080/static/webjars/jquery/3.6.1/jquery.js。显示如下:

jquery效果
可以使用spring.mvc.webjars-path-pattern=/wj/**修改webjars路径访问前缀,这样需要通过http://localhost:8080/static/wj/jquery/3.6.1/jquery.js进行访问

1.6 静态资源的关闭

可以通过配置参数:spring.web.resources.add-mappings=false,关闭所有静态资源

1.7 静态资源在浏览器的缓存

  • 浏览器会将静态资源缓存,在缓存时间过期前,不会向服务器进行静态资源的请求。通过配置参数进行设置:spring.web.resources.cache.period=3,单位为秒,默认为0秒

  • cacheControl: HTTP缓存控制。参考: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching。通过spring.web.resources.cache.cachecontrol.max-age=7200设置,默认是7200秒,优先级比spring.web.resources.cache.period高。如果没手动设置该参数,但手动设置了spring.web.resources.cache.period,则period参数生效

  • useLastModified:是否使用最后一次修改。配合cacheControl使用。比如如果浏览器访问了一个静态资源index.js,如果服务器这个资源没有发生变化,下次访问的时候就可以直接让浏览器用自己缓存中的东西,而不用给服务器发请求,此时浏览器状态码为304。通过spring.web.resources.cache.use-last-modified=true设置,默认为true

  • 共享缓存和私有缓存。共享缓存: 客户浏览器和代理服务器都会缓存;私有缓存: 只有客户浏览器会缓存。通过spring.web.resources.cache.cachecontrol.cache-public=truespring.web.resources.cache.cachecontrol.cache-private=false设置。默认由浏览器自行决定,但一般是私有缓存

1.8 静态资源实战

Controller中定义了一个@RequestMapping(“/static/baidu1.jpg”)路径,和resources\META-INF\resources\baidu1.jpg静态资源的路径一样。内容如下:

package com.hh.springboottest.myController;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping("/static/baidu1.jpg")
    public String helloHandle() {
        return "hello springboot";
    }
}

resources目录内容如下。分别有resources/META-INF/baidu1.jpg、resources/my-resources/baidu2.jpg、resources/public/baidu3.jpg、resources/resources/baidu4.jpg、resources/static/baidu5.jpg

resources目录内容
application.yaml内容如下。分别定义了静态资源访问URL根路径,和静态资源目录

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

  web:
    resources:
      static-locations: [classpath:/my-resources/]

访问http://localhost:8080/static/baidu1.jpg,效果如下:

访问static/baidu1.jpg
访问http://localhost:8080/static/baidu2.jpg,效果如下:
访问static/baidu2.jpg
http://localhost:8080/static/baidu3.jpg、http://localhost:8080/static/baidu4.jpg、http://localhost:8080/static/baidu5.jpg不能访问

1.9 通过代码自定义静态资源访问规则

如下。添加一个静态资源访问URL,并指定其访问资源路径和缓存时间。其原理是给容器中添加一个WebMvcConfigurer组件,让配置的底层行为都生效

import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.concurrent.TimeUnit;

// @EnableWebMvc  // 禁用springBoot的默认配置
// 这是一个配置类。给容器中放一个WebMvcConfigurer组件,就能自定义底层。有以下两种方式
//     1. 可以让配置类实现WebMvcConfigurer接口
//     2. 可以在配置类中,将@Bean注解标注在方法上,然后方法返回WebMvcConfigurer
@Configuration
public class WebConfig implements WebMvcConfigurer {


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 默认就会保留以前规则
        // WebMvcConfigurer.super.addResourceHandlers(registry);

        // 自己添加新的规则
        registry.addResourceHandler("/my-static/**")
                .addResourceLocations("classpath:/static1/", "classpath:/static2/")
                .setCacheControl(CacheControl.maxAge(1180, TimeUnit.SECONDS));
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/814498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RLHF 技术:如何能更有效?又有何局限性?

编者按&#xff1a;自ChatGPT推出后&#xff0c;基于人类反馈的强化学习(RLHF)技术便成为大模型构建和应用人员关注的热点。但该方法一些情况下效果却差强人意&#xff0c;有些基础模型经RLHF调优后反而表现更差。RLHF技术的适用性和具体操作细节似乎成谜。 这篇文章探讨了基于…

分享 13 个有用的 JavaScript 片段,提升你的工作效率

JavaScript 是您可以学习的最流行的语言之一。当我开始学习 JavaScript 时&#xff0c;我总是在 StackOverflow、medium 和其他博客上寻找代码片段。在这篇文章中&#xff0c;我将分享我发现它们有用的 15 个 JavaScript 代码片段。 1. 不循环地重复字符串 此 JS 片段将展示如何…

<C++> STL_string

目录 1.string类 2.string类的接口 2.1 成员函数 2.1.1 string构造函数 2.1.2 string赋值运算 2.1.3 string析构函数 2.2 string对象访问以及迭代器 2.2.1 string的遍历方式 2.2.2 迭代器的使用 2.2.3 const_迭代器的使用 2.2.4 at 2.2.5 back和front 2.3 string容…

手机防窥膜对眼睛危害非常大,快速避坑,避免智商税!

背景 如果你的手机贴了防窥膜&#xff0c;在室外阳光下你想看清楚机屏幕上的文字&#xff0c;是不是有个动作就是调亮屏幕&#xff01;因为防窥膜透光率比较低&#xff0c;那你就得提高手机亮度。 国产的防窥膜透光率只有30%左右韩国进口防窥膜的透光率在50%左右 透光率越低意味…

Semantic Kernel 入门系列:Kernel 内核和Skills 技能

理解了LLM的作用之后&#xff0c;如何才能构造出与LLM相结合的应用程序呢&#xff1f; 首先我们需要把LLM AI的能力和原生代码的能力区分开来&#xff0c;在Semantic Kernel&#xff08;以下简称SK&#xff09;&#xff0c;LLM的能力称为 semantic function &#xff0c;代码的…

innovus设置size only的方法

dbSet [dbGetInstByName $inst].dontTouch sizeOk 我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口

【BMC】OpenBMC使用基础(WSL2版本)

代码准备 OpenBMC是一个开源的项目&#xff0c;用于开发BMC固件。官网是https://www.openbmc.org/&#xff0c;不过里面似乎没有什么内容&#xff0c;所以还需要依赖其它的网站&#xff0c;https://github.com/openbmc&#xff0c;在这里可以下载到需要的代码和文档。其主体部…

工作中遇到的关于配置问题

工作中遇到的问题 想记录一下 一个程序员小白每天遇到的问题 1.创建了一个Maven的web工程&#xff0c;但是启动一直是404&#xff0c;原服务器未能找到目标资源 解决办法&#xff1a; 选择deployment&#xff0c;点击加号选择war格式就OK啦 目录里面无法创建类&#xff0…

如何在面试IT公司时展现出色的表现

在面试IT技术岗位的过程中&#xff0c;展现出色的表现是至关重要的。下面我将分享一些我个人的经验和观察&#xff0c;希望对大家有所帮助。 首先&#xff0c;提前准备是非常重要的。在面试前&#xff0c;你应该充分了解目标公司的业务和技术需求。这样你就能更好地回答面试官…

一些高频的C++ cache line面试

C那些事之False Sharing与Cache line 最近看到一段代码&#xff0c;手动做的对齐&#xff0c;于是研究一下不对齐又会带来什么影响&#xff1f; template <typename T> class AtomicWithPadding {private:static constexpr int kCacheLineSize 64;uint8_t padding_befor…

HTML+CSS+JavaScript:轮播图的自动播放、手动播放、鼠标悬停暂停播放

一、需求 昨天我们做了轮播图的自动播放&#xff0c;即每隔一秒自动切换一次 今天我们增加两个需求&#xff1a; 1、鼠标点击向右按钮&#xff0c;轮播图往后切换一次&#xff1b;鼠标点击向左按钮&#xff0c;轮播图往前切换一次 2、鼠标悬停在轮播图区域中时&#xff0c;…

闲鱼链接生成 仿闲鱼链接搭建

教程&#xff1a;修改数据库账号密码直接使用。 源码带有教程! 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

layui框架学习(36:数据表格_复杂表头)

table数据表格模块中的col属性支持配置复杂表头&#xff0c;其为二维数组&#xff0c;用于描述复杂表头中每个表头单元格的位置和尺寸信息&#xff08;colspan和rowspan描述表头单元格所占行数和列数&#xff09;。   从参考文献2-3给出的示例来看&#xff0c;描述复杂表头的…

[数学公式] 1秒移动x米是多少码 x码一秒钟移动几米

1秒移动x米是多少码&#xff1a;3.6x码 x码一秒钟移动几米&#xff1a;

6、用restful风格写controller方法接口,单元测试依赖

编写单元测试&#xff0c;用restful风格写controller方法 单元测试依赖 实际项目开发中&#xff0c;单元测试与业务代码通常都会要求同步进行 TDD测试驱动开发&#xff1a;先编写单元测试&#xff0c;然后努力去开发业务代码去满足所有的单元测试用例。 添加SpringBoot的测试…

LeetCode_双指针_中等_143.重排链表

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → L~n - 1~ → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → L~n - 1~ → L2 → L~n - 2~ → … 不…

python网站创建006:常见CSS样式

1. 给标签添加样式有三种方式(在标签上添加、在head中添加、通过独立文件添加)。 其中(在head中添加、通过独立文件添加)是有选择器存在的 直接在标签上添加 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><tit…

如何部署Redis哨兵

目录 一、Redis数据库 二、Redis哨兵模式 三、部署Redis哨兵 第一步 关闭防火墙和安全机制 第二步 修改Redis配置文件 第三步 开启Master主节点 第四步 查看哨兵信息 一、Redis数据库 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主…

使用 python 读取Excel文件并转换为时间格式

通过Excel 做配置文件调整参数&#xff0c;转换为实时参数&#xff1a; naclo_reduce_ratio pd.read_excel(./config/naclo_reduce_ratio.xlsx, header0) # col_name [Time, r1, r2]time_lst [] for i, row in naclo_reduce_ratio.iterrows():now_time_lst str(row[Time]…

Linux常用命令——dpkg-query命令

在线Linux命令查询工具 dpkg-query Debian Linux中软件包的查询工具 补充说明 dpkg-query命令是Debian Linux中软件包的查询工具&#xff0c;它从dpkg软件包数据库中查询并辨识软件包的信息。 语法 dpkg-query(选项)(参数)选项 -l&#xff1a;列出符合匹配模式的软件包&…