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


猜你喜欢
- 在使用EF查询数据的时候,我们常用的查询数据方式有linq to sql,linq to object,查询返回的结果有两种类型:IQuer
- 在Spring 5 Webflux中,配置CORS,可以通过自定义WebFilter实现:注:此种写法需真实跨域访问,监控header中才会
- HashMap 的线程不安全HashMap 的线程不安全主要体现在下面两个方面在 jdk 1.7 中,当并发执行扩容
- 在上篇文章给大家介绍了IntelliJ IDEA设置显示内存指示器和设置内存大小的方法,感兴趣的朋友可以点击阅读,今天给大家分享IDEA 设
- GridView设置如下:<asp:GridView ID="GridViewlb" runat="se
- 前言很多人觉得Xamarin的开源少,没法用来开发项目。但,实际上Xamarin已经有很多开源代码了;只要不是特别特殊的项目,基本上是都可以
- 写下来自己以后看:先是item的布局文件:里边放了一个图片和一个文本框<?xml version="1.0" en
- 今天在码代码的时候突然想到这个问题,觉得有点困惑。在网上也翻阅不少帖子其中有一个帖子给了我一个思路,其实也是解释了基础概念。概念一:try
- 本文实例讲述了Android继承ViewGroup实现Scroll滑动效果的方法。分享给大家供大家参考,具体如下:extends ViewG
- 话不多说,请看代码:package com.lxj.demo;import java.io.BufferedReader;import ja
- 游戏服务器里面总是有一大堆的配置文件需要读取, 而且这些配置文件的读取: * 要不然做成弱类型的, 就是一堆字符串或者数字, 不能看出来错误
- 原则:1、垃圾回收机制,维护引用信息不维护指针信息2、引用类型的实例化对象在生存期内由垃圾回收机制处理,可能移动内存3、当一个类的实例化对象
- 前言随着使用 Spring 进行开发的个人和企业越来越多,Spring 也慢慢从一个单一简洁的小框架变成一个大而全的开源软件,Spring
- 这篇文章主要介绍了spring强行注入和引用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 首先给大家声明一点:需要 jdk 7 , tomcat需要支持websocket的版本 1.InitServlet &n
- 概述常用的弹窗有菜单,或者Dialog,但更加人性化和可自定义的还是PopupWindow如果只是展示列表数据或者弹窗列表选择,直接使用Li
- Java程序设计 图形用户界面 【二】基本容器JFrameJFrame类的常用操作方法方法作用public JFrame() throws
- 动态参数拼接的查询语句–传入参数类型为自定义数据类型<select id="queryMessageList" p
- 本文实例讲述了C#读取csv格式文件的方法。分享给大家供大家参考。具体实现方法如下:一、CSV文件规则 1 开头是不留空,以行为单
- boot-admin整合Quartz实现动态管理定时任务淄博烧烤爆红出了圈,当你坐在八大局的烧烤摊,面前是火炉、烤串、小饼和蘸料,音乐响起,