public or static包下的 html 丢了(404)? 你快回来! 我一人承受不来

没想到吧,我把html还是放到了jar包中~

环境:

  • Spring Boot 版本 2.X
  • Java 版本 1.8.0 及以上

问题:

public or static包下的 html 丢了(404)?
话不多说先上图
image

image

我的目录结构是这样的

src
└── main└── java└── com└── example└── demo└── DemoApplication.java└── resources└── public├── css│   └── main.css├── js│   └── script.js└── index.html

Spring Boot 默认会自动配置 /public 目录下的静态资源文件,使其可以通过 / 根路径访问。这是通过 WebMvcAutoConfiguration 类来实现的。
那么找不到文件??? 这是什么原因?

排查

1、 先检查最基础的!! 依赖项 (理论上一定有依赖)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、 是不是有使用 Spring Security 是否开启了静态资源 允许访问

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/css/**", "/js/**", "/public/**").permitAll()  // 允许访问静态资源.anyRequest().authenticated();  // 其他请求需要认证}
}

3、 是不是有自主配置 WebMvcConfig 比如

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/");}
}

4、 是不是配置了yml? 自定义资源文件

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

5、 是不是开启了 @EnableWebMvc !!! (我是这个原因)

使用这个注解后 会使用 WebMvcConfigurationSupport 资源加载 所以就不识别 /public /static 这些了 spring-boot 默认使用的是 WebMvcAutoConfigurationAdapter

去掉这个注解后 发现可用了
image

学习

Spring Boot 的自动配置机制

Spring Boot 使用自动配置机制来简化开发者的配置工作。对于静态资源的处理,Spring Boot 会在启动时自动配置一个 ResourceHandler 来处理这些资源。

关键类和方法

1、 WebMvcAutoConfiguration 类:
这个类是Spring Boot自动配置的一部分,负责配置Spring MVC的相关设置,包括静态资源的处理。
2、 WebMvcAutoConfiguration.AddResourceHandlers 类:
这个内部类实现了 WebMvcConfigurer 接口,并提供了 addResourceHandlers 方法来添加资源处理器。

WebMvcAutoConfiguration 类

@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {@Configuration@ConditionalOnClass({ Servlet.class, RequestMappingHandlerMapping.class })@ConditionalOnMissingBean({ WebMvcRegistrations.class, WebMvcConfigurationSupport.class })@ConditionalOnBean(DispatcherServlet.class)@ConditionalOnWebApplication(type = Type.SERVLET)public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {private final ResourceProperties resourceProperties = new ResourceProperties();@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {if (!this.resourceProperties.isAddMappings()) {logger.debug("Default resource handling disabled");return;}Duration cachePeriod = this.resourceProperties.getCache().getPeriod();CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toBuilder();if (!registry.hasMappingForPattern("/webjars/**")) {customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));}String staticPathPattern = this.resourceProperties.getStatic().getPathPattern();if (!registry.hasMappingForPattern(staticPathPattern)) {customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern).addResourceLocations(getResourceLocations(this.resourceProperties.getStatic().getResourceLocations())).setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));}}private void customizeResourceHandlerRegistration(ResourceHandlerRegistration registration) {// Customization can be added here if needed}private long getSeconds(Duration duration) {return duration.isNegativeOrZero() ? -1 : duration.getSeconds();}private String[] getResourceLocations(String[] locations) {Assert.notNull(locations, "Locations must not be null");ArrayList<String> resolved = new ArrayList<>(locations.length);Arrays.stream(locations).forEach(location -> {if (location.startsWith(CLASSPATH_PREFIX)) {File file = getFileFromResourceLocation(location);if (file != null && file.exists() && file.isDirectory()) {String path = file.toURI().toString();if (!path.endsWith("/")) {path = path + "/";}resolved.add(path);} else {resolved.add(location);}} else {resolved.add(location);}});return toArray(resolved, String.class);}private File getFileFromResourceLocation(String location) {try {URL url = new UrlResource(location).getURL();if ("file".equals(url.getProtocol())) {return new File(url.toURI());}} catch (Exception ex) {// Ignore}return null;}private <T> T[] toArray(Collection<T> collection, Class<T> clazz) {return collection.toArray((T[]) Array.newInstance(clazz, collection.size()));}}
}

ResourceProperties 类

ResourceProperties 类用于配置静态资源的路径和其他相关属性

@ConfigurationProperties(prefix = "spring.resources")
public class ResourceProperties {private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {"classpath:/META-INF/resources/", "classpath:/resources/","classpath:/static/", "classpath:/public/" };private boolean addMappings = true;private Static static = new Static();// Getters and Setterspublic static class Static {private String pathPattern = "/**";private String[] resourceLocations = CLASSPATH_RESOURCE_LOCATIONS;// Getters and Setters}
}

ResourceProperties 类中的 CLASSPATH_RESOURCE_LOCATIONS 数组定义了默认的静态资源路径

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

在 WebMvcAutoConfiguration.AddResourceHandlers 类的 addResourceHandlers 方法中,Spring Boot 会自动添加一个资源处理器来处理这些默认路径下的静态资源:

if (!registry.hasMappingForPattern(staticPathPattern)) {customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern).addResourceLocations(getResourceLocations(this.resourceProperties.getStatic().getResourceLocations())).setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}

总结

Spring Boot 默认会自动配置 /public 目录下的静态资源文件,使其可以通过 / 根路径访问。这是通过 WebMvcAutoConfiguration 类中的 addResourceHandlers 方法实现的。该方法会注册一个资源处理器,处理默认路径下的静态资源文件,包括 classpath:/public/。

如果你在 src/main/resources/public 目录下放置了静态资源文件,Spring Boot 会自动配置一个资源处理器来处理这些文件的请求。你可以通过以下路径访问这些文件:

http://localhost:8080/index.html 访问 src/main/resources/public/index.html
http://localhost:8080/css/main.css 访问 src/main/resources/public/css/main.css
http://localhost:8080/js/script.js 访问 src/main/resources/public/js/script.js

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

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

相关文章

使用多种机器学习调参模型进行二分类建模的全流程,代做分析辅导

使用多种机器学习调参模型进行二分类建模的全流程教程 机器学习全流程分析各个模块用到的总的参数文件 0. 分析参数文件 参数文件名称&#xff1a;total_analysis_params_demo.xlsx &#xff0c;很多分析模块都是这个总的参数文件&#xff0c;我的这个总的参数文件如果有更新…

国家博物馆数据的爬取(包括xlsx文件、csv文件、图片爬取)

1、请求html数据 右键检查这里静态的数据被注释掉了,只能读取一条数据 import json import pandas as pd import requests from bs4 import BeautifulSoup import csv from urllib.parse import quote # 起始网址 header={User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; …

云技术基础介绍

云技术介绍 一、云技术历史 二、云服务 三、公有云服务商 四、云分类 1. 服务层级 IaaS (基础设施即服务) PaaS (平台即服务) SaaS (软件即服务) 2. 云部署模式的分类 公有云 (Public Cloud) 私有云 (Private Cloud) 混合云 (Hybrid Cloud) 社区云 (Community Clo…

常用的c++新特性-->day09

原子变量 C11提供了一个原子类型std::atomic&#xff0c;通过这个原子类型管理的内部变量就可以称之为原子变量&#xff0c;我们可以给原子类型指定bool、char、int、long、指针等类型作为模板参数&#xff08;不支持浮点类型和复合类型&#xff09;。 原子变量会把线程对数据的…

新的服务器Centos7.6 安装基础的环境配置(新服务器可直接粘贴使用配置)

常见的基础服务器配置之Centos命令 正常来说都是安装一个docker基本上很多问题都可以解决了&#xff0c;我基本上都是通过docker去管理一些容器如&#xff1a;mysql、redis、mongoDB等之类的镜像&#xff0c;还有一些中间件如kafka。下面就安装一个 docker 和 nginx 的相关配置…

RAG与知识库搭建,手把手教你构建RAG系统

0. 简介 自从发现可以利用自有数据来增强大语言模型&#xff08;LLM&#xff09;的能力以来&#xff0c;如何将 LLM 的通用知识与个人数据有效结合一直是热门话题。关于使用微调&#xff08;fine-tuning&#xff09;还是检索增强生成&#xff08;RAG&#xff09;来实现这一目标…

【数据结构】10.线索二叉树

一、线索二叉树的产生 采用先序、中序、后序三种方法遍历二叉树后都可以得到一个线性序列&#xff0c;序列上的每一个结点&#xff08;除了第一个和最后一个&#xff09;都有一个前驱和一个后继&#xff0c;但是&#xff0c;这个线性序列只是逻辑的概念&#xff0c;不是物理结…

java实现中小企业的erp系统

项目介绍 技术架构: springboot3jdk17mybatis-plusmysql8kotlinvueuniappelementui等

企业软文营销如何以差异化卖点助力品牌市场曝光?媒介盒子分享

对于市场竞争日益激烈的现下&#xff0c;企业想要获取优势&#xff0c;从市场中脱颖而出并能吸引到更多的消费者&#xff0c;学会创建或找寻到自身的差异点是至关重要的。常言讲“物以稀为贵”&#xff0c;对于消费者而言&#xff0c;品类相同中的品牌需要去以“不同”来获取用…

探索Pillow库:Python图像处理的瑞士军刀

文章目录 **探索Pillow库&#xff1a;Python图像处理的瑞士军刀**1. 背景&#xff1a;为何选择Pillow&#xff1f;2. Pillow是什么&#xff1f;3. 如何安装Pillow&#xff1f;4. 五个简单的库函数使用方法4.1 打开图像4.2 显示图像4.3 转换图像格式4.4 调整图像大小4.5 旋转图像…

快速入门Selenium自动化测试

一、背景与意义 Selenium是常用的Web自动化测试工具&#xff0c;前端开发工程师可以在完成每项开发任务之后&#xff0c;使用Selenuim做一下回归测试&#xff0c;以避免被提BUG太多导致后面做项目总结时太难看。测试工程师学习Selenium时需要掌握很多API接口&#xff0c;例如页…

Java基础-内部类与异常处理

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、Java 内部类 什么是内部类&#xff1f; 使用内部类的优点 访问局部变量的限制 内部类和继承 内部…

HCIP—MSTP(多生成树协议)

目录 一、MSTP技术的背景 二 、MSTP&#xff08;多生成树协议&#xff09;的概述 三、MSTP的基本概念 四、MSTP的实验配置 MSTP的引入&#xff1a;单点故障——冗余——二层环路——STP——RSTP——MSTP 一、MSTP技术的背景 单生成树的弊端—部分VLAN路径不同 单生成树的弊…

光控资本:中字头,多股涨停!融资客大举加仓

11月13日&#xff0c;受昨夜外盘心境影响&#xff0c;A股三大指数集体低开&#xff0c;沪指盘中翻红&#xff0c;A50期货指数快速拉升。 当时A股心境并未降温&#xff0c;代表商场急进心境的融资余额数据继续攀升&#xff0c;现在仅次于2015年牛市高点。‍‍‍ 从近期的盘面来…

项目功能--项目介绍(健康管理系统)

一、项目介绍 健康管理系统是一款应用于健康管理机构的业务系统&#xff0c;实现健康管理机构工作内容可视化、会员管理专业化、健康评估数字化、健康干预流程化、知识库集成化&#xff0c;从而提高健康管理师的工作效率&#xff0c;加强与会员间的互动&#xff0c;增强管理者对…

【深度学习目标检测|YOLO算法4-4】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析——工业领域

【深度学习目标检测|YOLO算法4-4】YOLO家族进化史&#xff1a;从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析——工业领域 【深度学习目标检测|YOLO算法4-4】YOLO家族进化史&#xff1a;从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析——工业领域 文章目录…

Warped Universe游戏即将在Sui上推出,为玩家提供多样化的游戏体验

Warped Games选择Sui作为其即将推出的创新多类型游戏Warped Universe的首选Web3技术。Warped Universe让玩家可以体验第三视角实时动作、回合制策略和基地建设等玩法。该游戏使用Unreal Engine 5开发&#xff0c;将借助Sui的技术使玩家能够拥有、交易和变现其游戏内资产。 War…

【数据运营】数据治理与运营新纪元:全面解析数据治理平台与运营体系建设方案

踏入数据治理与运营的新纪元,我们迎来了一场深刻变革。本篇文章将带您全面解析数据治理平台与数据运营体系的建设方案,为您揭示数据治理的总体解决策略,探索数据治理平台构建的奥秘,以及数据治理运营实施的具体路径。 数据治理总体解决方案是数据治理与运营体系建设…

PyCharm2024.2.4安装

一、官网下载 1.从下面的链接点进去 PyCharm: The Python IDE for data science and web development by JetBrains 2.进入官网后,下载pycharm安装包 3.点击下载能适配你系统的安装包 4.安装包下载完成 二、安装 1.下载完成后,打开点击右键,打开 2.下一步

【无人机设计与控制】线性和非线性模型预测MPC、NMPC四旋翼无人机轨迹跟踪

摘要 本文研究了四旋翼无人机的线性和非线性模型预测控制&#xff08;MPC与NMPC&#xff09;算法在轨迹跟踪中的应用。通过Matlab/Simulink仿真实现了四旋翼无人机在复杂环境中的高效轨迹跟踪。研究结果表明&#xff0c;NMPC比传统MPC在处理非线性动态和外部扰动时具有更好的鲁…