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

 更新时间:2022年11月16日 15:26:52   作者:佯佯Young  
这篇文章主要介绍了SpringBoot配置外部静态资源映射问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBoot配置外部静态资源映射

使用场景

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

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

SpringBoot版本说明

版本:2.3.4.RELEASE

添加外部路径配置

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

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

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/]

③静态资源映射底层原理 

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

/web/servlet/WebMvcAutoConfiguration

解析一:**

当配置文件中设置

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

解析二:

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

解析三:

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

 

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

解析四:

 

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

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

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

④欢迎页的处理规则

解析一:

点进WelcomePageHandlerMapping构造器方法中

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

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

⑤favicon原理 

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈SpringBoot如何自定义Starters

    浅谈SpringBoot如何自定义Starters

    今天带大家来学习SpringBoot如何自定义Starters,文中有非常详细的图文介绍及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • SpringBoot+Vue前后端分离实现审核功能的示例

    SpringBoot+Vue前后端分离实现审核功能的示例

    在实际开发中,审核功能是一个非常常用的功能,本文就来介绍一下使用SpringBoot+Vue前后端分离实现审核功能的示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Java反射机制介绍

    Java反射机制介绍

    Java的反射机制是在运行状态中,对于任何一个类,都可以知道这个类的所有属性和方法,对于任何一个对象,都可以调用它所有的方法和属性,修改部分类型信息,这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制
    2022-08-08
  • RedisTemplate.opsForHash()用法简介并举例说明

    RedisTemplate.opsForHash()用法简介并举例说明

    redistemplate.opsforhash是RedisTemplate模板类中的一个方法,用于获取操作哈希数据类型的接口,这篇文章主要给大家介绍了关于RedisTemplate.opsForHash()用法简介并举例说明的相关资料,需要的朋友可以参考下
    2024-06-06
  • Apache Commons Math3学习之数值积分实例代码

    Apache Commons Math3学习之数值积分实例代码

    这篇文章主要介绍了Apache Commons Math3学习之数值积分实例代码,涉及使用辛普森积分的例子,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • @Value设置默认值后,获取不到配置值的原因分析

    @Value设置默认值后,获取不到配置值的原因分析

    这篇文章主要介绍了@Value设置默认值后,获取不到配置值的原因,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 使用SpringBoot跨系统调用接口的方案

    使用SpringBoot跨系统调用接口的方案

    这篇文章主要介绍了使用SpringBoot跨系统调用接口的方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • springboot+thymeleaf找不到视图的解决方案

    springboot+thymeleaf找不到视图的解决方案

    这篇文章主要介绍了springboot+thymeleaf找不到视图的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 基于SpringBoot+Redis实现一个简单的限流器

    基于SpringBoot+Redis实现一个简单的限流器

    在Spring Boot中使用Redis和过滤器实现请求限流,过滤器将在每个请求到达时检查请求频率,并根据设定的阈值进行限制,这样可以保护您的应用程序免受恶意请求或高并发请求的影响,本文我们通过Spring Boot +Redis 实现一个轻量级的消息队列,需要的朋友可以参考下
    2023-08-08
  • 浅谈多线程_让程序更高效的运行

    浅谈多线程_让程序更高效的运行

    下面小编就为大家带来一篇浅谈多线程_让程序更高效的运行。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论