相关推荐recommended
SpringBoot 静态资源映射
作者:mmseoamin日期:2024-04-29

文章目录

  • 一、静态资源映射
    • 1.1 什么是静态资源映射
    • 1.2 常见的静态资源映射方式
    • 二、SpringBooot默认配置
      • 2.1 resources 目录
      • 2.2 SpringBoot 默认配置
      • 三、SpringBoot手动配置
        • 3.1 配置属性
        • 3.2 自定义配置类
        • 参考资料

          一、静态资源映射

          1.1 什么是静态资源映射

          资源映射指的是将应用程序中的资源(如静态文件、模板、图片等)与对这些资源的访问路径进行关联的过程。在Web应用程序中,资源映射是指将特定路径映射到项目中的特定资源文件或处理逻辑上。

          在Web开发中,常见的资源包括静态文件(如HTML、CSS、JavaScript)、模板文件(如JSP、Thymeleaf、FreeMarker等)、图片、音频等。这些资源通过映射规则可以在Web应用程序中被访问。

          资源映射的目的是方便客户端通过HTTP请求来获取这些资源。

          1.2 常见的静态资源映射方式

          Spring Boot提供了灵活的资源映射机制,允许开发者根据需求配置静态资源的访问路径和位置。默认情况下,Spring Boot会将一些特定目录(如/static、/public、/resources、/META-INF/resources)中的静态资源映射到根路径。这意味着这些目录下的资源文件可以通过根路径直接访问。

          对于一些小的静态资源,直接 SpringBoot 规划静态资源,也是个不错的选择。

          但是,在真实项目里,图片可以直接存储在对象存储的存储桶内或者直接用 Nginx 进行反代。

          二、SpringBooot默认配置

          2.1 resources 目录

          由于 src/main/resources 默认位于类路径 classpath 上,因此可以将静态资源放置在这个目录下。在编写项目时,通常会将静态资源放置在 /resources 目录下。而这个 resources 目录可以根据具体的使用途径分为 public、static、templates 等目录。不同目录的区别主要为:

          • public 目录:存放公共的静态资源文件,例如 CSS、JavaScript 等。这些文件会被直接映射到根路径,可以通过根路径直接访问。
          • static 目录: 用于存放静态资源文件,如CSS、JavaScript、图片等。这些文件同样会被直接映射到根路径,可以通过根路径直接访问。在Spring Boot中,默认的静态资源目录。
          • templates 目录: 存放模板文件,例如Thymeleaf或FreeMarker模板文件。这些文件通常用于生成动态内容的视图。这个目录下的文件不会直接被访问,而是通过Controller生成的模型数据渲染生成HTML页面。

            这些目录的区别在于它们的用途和映射规则。public 和 static 目录中的静态资源可以直接通过根路径访问,而 templates 目录下的文件需要由Controller生成的模型数据进行渲染后才能生成最终的HTML页面。选择使用哪个目录取决于你的项目需求和使用的模板引擎。

            2.2 SpringBoot 默认配置

            Spring Boot带有预先配置的 ResourceHttpRequestHandler 实现,以方便服务静态资源。

            默认情况下,ResourceHttpRequestHandler处理器会处理 类路径 classpath 上的/static、/public、/resources和/META-INF/resources这些目录里面的静态资源。 这意味着在这些目录下放置的静态资源可以通过根路径访问。例如,如果我们在类路径的 /static 目录中放置一个 about. html 文件,那么我们可以通过 http://localhost:8080/about.html 访问该文件。同样,我们可以通过在其他提到的目录中添加该文件来获得相同的结果。

            但是,SpringBoot默认配置方式存在较大的缺点:将SpringBoot项目打包为 war 包时,将会把图片等项目中所有的静态资源全都打包进去,这显然对于发布维护是非常不方便的,因此我么可以将静态资源放置在服务器的某些磁盘中,并通过 SpringBoot 进行访问

            三、SpringBoot手动配置

            默认情况下,Spring Boot在请求的根部分下提供所有静态内容, /**。 即使它看起来是一个很好的默认配置,我们在一些情况下任需要修改。

            SpringBoot内设置静态资源,或者说静态资源文件夹,主要有两种方法(均为SpringMVC实现):

            • 在application.yml/application.properties内配置属性。
            • 设置Configuration配置类。

              详细内容参考Spring官方文档:https://www.baeldung.com/spring-mvc-static-resources

              3.1 配置属性

              在Spring Boot中,可以通过在 application.yml 或 application.properties 文件中配置一些属性来定制应用程序的行为。以下是关于静态资源路径配置的两个属性的介绍:

              (1)spring.mvc.static-path-pattern

              spring.mvc.static-path-pattern :配置 Spring MVC 静态资源映射的路径模式。 这个配置项 指定了URL路径中用于访问静态资源的模式。例如,如果设置为 /myresources/**,那么类路径下的 /myresources/ 目录中的静态资源可以通过 /myresources/ 路径访问。这个配置项主要影响URL路径的结构,决定了客户端如何请求静态资源。

              举例来说,假设你有以下目录结构:

              src
              |-- main
                  |-- resources
                      |-- static
                          |-- about.html
              

              如果我们想通过 http://localhost:8080/content/about.html 访问同一个文件,我们可以在 application.properties 文件里面这样设置:

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

              这个配置将使得所有以 /content/ 开头的URL路径都会去寻找静态资源,而这些静态资源默认情况下存放在 src/main/resources/static 目录中。

              (2)spring.web.resources.static-locations

              spring.web.resources.static-locations: 配置静态资源的位置。可以指定一个或多个路径,Spring Boot将在这些路径中查找静态资源。这对于将静态资源存储在项目外部,并通过相对路径访问它们非常有用。

              举个例子,假设你有以下目录结构

              src
              |-- main
                  |-- resources
                      |-- myresources
                          |-- about.html
              

              设置 spring.web.resources.static-locations,具体代码如下:

              spring.web.resources.static-locations=classpath:/myresources/, file:/path/to/external/resources/
              

              在这个例子中,classpath:/myresources/ 表示在类路径下的 /myresources/ 目录中查找静态资源,file:/path/to/external/resources/ 表示在外部指定目录中查找静态资源。我们可以通过 http://localhost:8080/about.html 访问 about.html 这个文件

              3.2 自定义配置类

              在 SpringBoot 框架中,我们可以通过实现 WebMvcConfigrer 接口,来进行一些配置

              @Configuration
              @EnableWebMvc
              public class WebConfig implements WebMvcConfigurer {
              	// Implement configuration methods...
              }
              

              Spring 3.1引入了配置 ResourceHttpRequestHandlers 的 ResourceHandlerRegistry ,用于从类路径、WAR或文件系统提供静态资源。我们可以 在Web上下文配置类中以编程方式配置 ResourceHandlerRegistry

              (1)ResourceHandlerRegistry 提供的函数

              ResourceHandlerRegistry 提供了多个函数用于配置

              • addResourceHandler: 添加一个静态资源处理器,指定了URL路径模式。
              • addResourceLocations: 指定静态资源的位置,可以是类路径下的目录(使用 classpath: 前缀)或外部文件系统的路径(使用 file: 前缀)

                这样的配置允许你同时映射不同路径的静态资源到不同的位置,包括类路径和外部文件系统。

                (2)创建配置类

                在 src/main/java/config 目录里,创建了一个配置类 WebConfig,并实现了 WebMvcConfigurer 接口,通过重写 addResourceHandlers 方法来自定义静态资源的映射规则。

                import org.springframework.context.annotation.Configuration;
                import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
                import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
                @Configuration
                @EnableWebMvc
                public class WebConfig implements WebMvcConfigurer {
                    @Override
                    public void addResourceHandlers(ResourceHandlerRegistry registry) {
                        // 1. 映射 /myresources/** 到类路径下的 /myresources/ 目录
                        registry.addResourceHandler("/myresources/**")
                                .addResourceLocations("classpath:/myresources/");
                        // 2. 映射 /externalresources/** 到外部文件系统的指定目录
                        //    注意:需要替换成实际的外部文件系统路径
                        registry.addResourceHandler("/externalresources/**")
                                .addResourceLocations("file:/path/to/external/resources/");
                        // 3. 映射 /custompath/** 到外部文件系统的另一个指定目录
                        //    注意:需要替换成实际的外部文件系统路径
                        registry.addResourceHandler("/custompath/**")
                                .addResourceLocations("file:/path/to/another/directory/");
                    }
                }
                

                参考资料

                Serve Static Resources with Spring | Baeldung (推荐阅读资料)

                Static Resources :: Spring Framework (SpringBoot 官方教程)

                SpringBoot多种方法处理静态资源:设置并访问静态资源目录_SpringBoot 静态资源-CSDN博客

                SpringBoot 自定义静态资源映射目录(配置addResourceHandler和addResourceLocations映射静态资源地址)-CSDN博客