SpringBoot配置外部静态资源映射问题

作者:佯佯Young 时间:2021-07-22 00:27:50 

SpringBoot配置外部静态资源映射

使用场景

实际项目中,特别是前后端分离的项目,SpringBoot后台打包(jar包)后,以jar包形式直接启动服务后,项目中包含的静态资源则无法动态修改。

此时,需要配置一个外部的映射路径来实现静态资源访问和修改、上传功能等。

SpringBoot版本说明

版本:2.3.4.RELEASE

SpringBoot配置外部静态资源映射问题

添加外部路径配置

staticPath为自定义的外部资源物理路径,放在配置文件中,如:D:/Tasks/

application.properties文件内容如下:

server.port=8086
server.servlet.context-path=/iserver
spring.output.ansi.enabled=ALWAYS
spring.mvc.static-path-pattern=/static/**
spring.mvc.format.date=yyyy-MM-dd HH:mm:ss

project.static = D:/Tasks/

配置映射

添加WebMvcConfig,如下:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

@Value("${project.static}")
   private String staticPath;
/**
* 跨域
**/
@Override
   public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**")
       .allowedHeaders("*")
               .allowedOrigins("*")
               .allowedMethods("POST","GET","PUT","OPTIONS","DELETE")
               .allowCredentials(true);
   }
   /**
    * 静态资源处理
    **/
   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/file/**").addResourceLocations("file:" + staticPath);
       registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
   }
}

测试访问

在D盘新建Tasks文件夹,在新建js文件夹,存放jquery-3.1.1.min.js

SpringBoot配置外部静态资源映射问题

正常启动项目,在浏览器输入地址: http://localhost:8086/iserver/file/js/jquery-3.1.1.min.js

SpringBoot配置外部静态资源映射问题

SpringBoot静态资源映射原理

HandlerMapping:处理器映射。保存了每一个Handler能处理哪些请求。 

①静态资源读取 

只要静态资源放在类路径下: /static、public 、/resources 、/META-INF/resources这四个类路径目录下, 

则访问 : 当前项目根路径/ + 静态资源名就可以读取到这四个目录下的静态资源 

原理: 静态映射/ 

请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面 

②改变默认的静态资源路径

spring:

//这个修改用户访问服务器时资源映射的前缀(默认无前缀,即/+资源名可以直接访问,现在需要加上前缀res/) 

(但是这个修改资源映射前缀会导致欢迎页和favicon失效,因为底层代码是死代码 / 映射到服务器静态资源目录中,而不是spring.mvc.static-path-pattern这个变量) 

mvc:

static-path-pattern: /res/

//这个修改静态资源在服务器的默认存放路径(默认是/static/,/public/,/resources/、META-INF/resouces/) 

resources: 

static-locations: [classpath:/haha/]

③静态资源映射底层原理 

静态资源映射自动配置类地址–

SpringBoot配置外部静态资源映射问题

SpringBoot配置外部静态资源映射问题

/web/servlet/WebMvcAutoConfiguration

SpringBoot配置外部静态资源映射问题

解析一:**

SpringBoot配置外部静态资源映射问题

当配置文件中设置

SpringBoot配置外部静态资源映射问题

则循环进去,下面配置的所有静态资源映射规则不生效

解析二:

SpringBoot配置外部静态资源映射问题

可以在配置文件中设置静态资源的缓存规则,比如设置浏览器缓存静态资源的时长

解析三:

SpringBoot配置外部静态资源映射问题

将外部访问/webjars/的请求映射到/META-INF/resources/webjars/

SpringBoot配置外部静态资源映射问题 

即外界访问/webjars/jquery/3.5.1/jquery.js就可以直接访问到这个路径下的jquery.js 

解析四:

SpringBoot配置外部静态资源映射问题 

首先获取到配置文件中设置的static-Path-Pattern设置的静态资源访问路径,如果没有设置,则默认为/** 

这个访问路径映射对应服务器中的以下路径

SpringBoot配置外部静态资源映射问题

所以静态资源放在上述四个目录(而这些目录也是可以在配置文件中修改的)中时,外界访问/+资源名,相当于在这四个目录中寻找要找的资源 

④欢迎页的处理规则

SpringBoot配置外部静态资源映射问题

解析一:

SpringBoot配置外部静态资源映射问题

点进WelcomePageHandlerMapping构造器方法中

SpringBoot配置外部静态资源映射问题

从中可以看到,只有欢迎页存在,并且staticPathPattern等于/**时,才能够使用欢迎页功能 

否则调用能处理index请求的controller 

⑤favicon原理 

favicon是浏览器自动向服务器发送请求/favicon.ico请求来设置页面图标,和代码没什么关系,所以当修改了配置文件中的staticPathPattern时,/favicon.ico不能够在服务器找到对应前缀目录下的favicon.ico,自然设置不了页面图标

来源:https://blog.csdn.net/yy284872497/article/details/117135638

标签:SpringBoot,配置,静态资源,映射
0
投稿

猜你喜欢

  • Java Bean转Map的那些踩坑实战

    2022-12-26 05:42:23
  • 老生常谈Java 网络编程 —— Socket 详解

    2023-07-12 16:32:54
  • jdk源码阅读Collection详解

    2022-07-25 08:57:40
  • c#中datagridview处理非绑定列的方法

    2023-06-15 16:52:31
  • Android App仿QQ制作Material Design风格沉浸式状态栏

    2021-06-07 01:10:48
  • android ListView结合xutils3仿微信实现下拉加载更多

    2023-11-29 11:11:50
  • android 网络请求库volley方法详解

    2022-01-01 01:34:30
  • Java 使用 FFmpeg 处理视频文件示例代码详解

    2023-03-19 00:54:37
  • 一文详解Spring是怎么读取配置Xml文件的

    2023-07-30 00:27:37
  • 浅谈JAVA8给我带了什么——流的概念和收集器

    2021-09-24 03:14:04
  • 聊聊如何打印GC日志排查的问题

    2023-01-22 22:10:56
  • 详解java8在Collection中新增加的方法removeIf

    2022-06-04 20:51:45
  • Springboot整合PageOffice 实现word在线编辑保存功能

    2022-12-03 22:38:18
  • Java8中stream和functional interface的配合使用详解

    2023-02-27 22:44:51
  • Android同步屏障机制sync barrier实例应用详解

    2023-04-24 05:27:04
  • android自定义View实现简单五子棋游戏

    2022-09-16 14:52:30
  • java中面向对象的概念及知识点总结

    2022-07-14 03:14:01
  • C#识别出图片里的数字和字母

    2023-04-12 08:21:41
  • Python调用Java可执行jar包问题

    2021-06-02 10:26:26
  • C#多线程编程Task用法详解

    2021-10-27 14:26:10
  • asp之家 软件编程 m.aspxhome.com