SpringBoot配置外部静态资源映射问题
作者:佯佯Young 时间:2021-07-22 00:27:50
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,自然设置不了页面图标
来源:https://blog.csdn.net/yy284872497/article/details/117135638
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C# winform分页查询的实现示例
![](https://img.aspxhome.com/file/2023/0/100150_0s.png)
Java的设计模式编程中迪米特法则的应用示例
Java的接口和抽象类深入理解
Java中自动装箱、拆箱引起的耗时详解
java的泛型你真的了解吗
![](https://img.aspxhome.com/file/2023/5/60355_0s.jpg)
C#实现程序等待延迟执行的方法
一个进程间通讯同步的C#框架引荐
![](https://img.aspxhome.com/file/2023/9/98189_0s.gif)
在Spring使用iBatis及配置讲解
Spring Boot 2.7.6整合redis与低版本的区别
![](https://img.aspxhome.com/file/2023/7/59697_0s.png)
Java常用数字工具类 数字转汉字(1)
![](https://img.aspxhome.com/file/2023/3/63773_0s.jpg)
利用java开发简易版扫雷游戏
![](https://img.aspxhome.com/file/2023/9/63489_0s.png)
c# 给pdf添加数字签名的步骤
![](https://img.aspxhome.com/file/2023/1/71741_0s.png)
mybatis和mybatis-plus同时使用的坑
C#使用windows服务开启应用程序的方法
Java Swing中JList选择事件监听器ListSelectionListener用法示例
![](https://img.aspxhome.com/file/2023/0/61550_0s.gif)
Tomcat内存溢出分析及解决方法
Spring实现内置监听器
![](https://img.aspxhome.com/file/2023/8/63318_0s.png)
Java8中stream和functional interface的配合使用详解
使用c#+IMap实现收取163邮件
![](https://img.aspxhome.com/file/2023/4/100194_0s.png)
c#实现输出的字符靠右对齐的示例
![](https://img.aspxhome.com/file/2023/0/82140_0s.jpg)