springBoot快速访问工程目录下的静态资源

目录
  • 1、牛刀小试
    • 1.1 图片静态资源的访问
    • 1.2 为静态资源添加访问前缀
    • 1.3 WelCome Page 的奇妙跳转
  • 2、那么,SpringBoot是如何做到的呢?

1、牛刀小试

1.1 图片静态资源的访问

先看官方怎么说,点击链接,打开SpringBoot官方文档

文档中明确指出:/static(or/publicor/resourcesor/META-INF/resources) ,这几个目录是SpringBoot放置静态资源的目录,只要把静态资源放到这几个目录下,就能直接访问到。

新建 Spingboot web项目试下,新项目只有 /static 目录 ,手动创建其他几个静态资源文件夹,每个目录添加1张图片

启动项目,分别访问这四张图片:

发现图片均可访问,

文档说的对,果然没骗人,

由此我们认定 SpringBoot 访问静态资源:当前项目根路径 + / + 静态资源名

1.2 为静态资源添加访问前缀

By default, resources are mapped on /**, but you can tune that with the spring.mvc.static-path-pattern property. For instance, relocating all resources to /resources/** can be achieved as follows:

PropertiesYaml
spring.mvc.static-path-pattern=/resources/**

文档又解释了一下,说,默认情况下SpringBoot是帮你映射的路径是/** ,

但是,如果你想加一个前缀也可以,比如 /res/

技术圈有句话:先有业务才有技术,SpringBoot官方考虑到某些网站添加了登录验证,一般需要登录后才能访问项目中的资源,为了登录页样式也能正常显示,方便放行静态资源,直接给所有静态资源添加一个前缀,既可统一拦截,又可统一放开

操作:在配置文件application.properties中添加

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

添加完再去访问原来的dog图片链接:http://localhost:8080/dog.jpeg

但是访问:http://localhost:8080/res/dog.jpeg发现这才可以

嘿嘿😋

1.3 WelCome Page 的奇妙跳转

7.1.6. Welcome Page
Spring Boot supports both static and templated welcome pages. It first looks for an index.html file in the configured static content locations. If one is not found, it then looks for an index template. If either is found, it is automatically used as the welcome page of the application.

文档说把一个名称叫 index.html 的文件放到任意的静态目录下,访问http://localhost:8080即可到达,意思就是给你一个首页跳转的快捷方式(注意:需把1.2 的配置路径去掉,否则会导致welcome page功能失效,后面源码分析会说到)

新建html,放到 /static 下,访问:

2、那么,SpringBoot是如何做到的呢?

接下来看源码探究 SpringBoot 静态资源配置原理 》》》》 gogogo

源码位置在:spring-boot-autoconfigure-2.5.1.jar 这个jar里面,具体的目录如下:

/spring-boot-autoconfigure-2.5.1.jar!/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.class

WebMvcAutoConfiguration 类里面找到addResourceHandlers 方法,顾名思义 添加资源处理器

@Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            // 相当于一个开关去控制静态资源处理器的加载,默认为true,设置为false就会禁止所有规则
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
                return;
            }
            //第一个就配置webjars的访问规则,规定在类路径的/META-INF/resources/webjars/路径下,感兴趣的同学可以点进方法去,里面还配置了webjars的浏览器端缓存时间,是在application。propertities中的一个配置项 spring.web.resources.cache.period
            addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
            //这里配置了静态资源的四个访问路径
            addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
                registration.addResourceLocations(this.resourceProperties.getStaticLocations());
                if (this.servletContext != null) {
                    ServletContextResource resource = new ServletContextResource(this.servletContext, SERVLET_LOCATION);
                    registration.addResourceLocations(resource);
                }
            });
        }

第一个if判断this.resourceProperties.isAddMappings() 去配置文件获取

spring.resources 这个属性,默认是 true , 如果设置为false 那么就等于禁用掉所有的静态资源映射功能,不行就试一下

#springapplication.propertities中配置
spring.web.resources.add-mappings=false

重启项目,发现首页无法访问了...

改回 true ,首页就又可以访问了

不要停留,继续看第二个addResourceHandler 方法,打断点看看这个方法添加了什么规则

没错,第二个addResourceHandler 方法就表明 / **下的所有请求,都在这四个默认的位置去找静态资源映射 ,这四个目录在官方文档中提到过。

另外,访问路径前缀是在 this.mvcProperties.getStaticPathPattern() 获取的,配置上:

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

打断点如下:

注意📢: 所有的请求先去controller控制器找映射,找不到,再来静态资源映射器。

到这里解决了静态资源目录的问题。

马不停蹄,探究 Welcome Page 的事情 》》》》》

还是在 WebMvcAutoConfiguration 这个类:搜索 “WelcomePage” :

@Bean
        public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
                FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
            WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
                    new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
                    this.mvcProperties.getStaticPathPattern());
            welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
            welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
            return welcomePageHandlerMapping;
        }

把WelcomePageHandlerMapping 的有参构造也拿来

WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,
            ApplicationContext applicationContext, Resource welcomePage, String staticPathPattern) {
        if (welcomePage != null && "/**".equals(staticPathPattern)) {
            logger.info("Adding welcome page: " + welcomePage);
            setRootViewName("forward:index.html");
        }
        else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {
            logger.info("Adding welcome page template: index");
            setRootViewName("index");
        }
    }

根据有参构造可以看出来,只有 欢迎页这个资源存在,并且 静态资源访问路径是 /** ,才能重定向到indes.html ,否则就会去找 Controller 处理。

这就解释了,上面为什么配置了静态资源访问路径 为/res/** 后导致首页无法访问到 的问题

好了,前面牛刀小试的坑已经填完了,关于SpringBoot 静态资源配置原理 这篇总结就到这了

以上就是SprignBoot访问工程目录下的静态资源的详细内容,更多关于SprignBoot访问静态资源的资料请关注我们其它相关文章!

(0)

相关推荐

  • springboot2版本无法加载静态资源问题解决

    前言 在学习springboot的过程中,发现无法引用静态资源.我使用的是springboot2.2.1版本. 追溯源码,终于解决.并记录下解决思路. 默认加载路径 首先得知道springboot默认加载得资源路径是什么. 首先我们看WebMvcAutoConfiguration这个类.里面有一个方法叫做addResourceHandlers() @Configuration(proxyBeanMethods = false) @ConditionalOnWebApplication(type

  • spring boot 自定义规则访问获取内部或者外部静态资源图片的方法

    项目中需要将图片放在磁盘上,不能将图片放在webapp下面! springboot默认配置基本上可以满足我们的日常需要.但是项目中大量用户上传的图片,不能放在tomcat下面,这样子每次重新部署项目的时候,图片就失效了,很是麻烦. 所以此时就需要自定义配置springboot的项目静态文件映射 springboot默认的配置规则 映射 /** 到 classpath:/static classpath:/public classpath:/resources classpath:/META-IN

  • Spring boot 默认静态资源路径与手动配置访问路径的方法

    在application.propertis中配置 ##端口号 server.port=8081 ##默认前缀 spring.mvc.view.prefix=/ ## 响应页面默认后缀 spring.mvc.view.suffix=.html # 默认值为 /** spring.mvc.static-path-pattern=/** # 这里设置要指向的路径,多个使用英文逗号隔开,默认值为 classpath:/META-INF/resources/,classpath:/resources/,

  • SpringBoot中配置Web静态资源路径的方法

    介绍: 本文章主要针对web项目中的两个问题进行详细解析介绍:1- 页面跳转404,即controller转发无法跳转页面问题:2- 静态资源文件路径问题. 项目工具: Intelij Idea, JDK1.8, SpringBoot 2.1.3 正文: 准备工作:通过Idea创建一个SpringBoot-web项目,此过程不做赘述,创建完成后项目结构如下图: 1- 创建一个controller代码如下: package com.example.webpractice.controller; i

  • 详解SpringBoot之访问静态资源(webapp...)

    springboot访问静态资源,默认有两个默认目录, 一个是  classpath/static 目录 (src/mian/resource) 一个是 ServletContext 根目录下( src/main/webapp ) 这在里可能有小伙伴对 classpath 不怎么了解,这里简要的介绍下,classpath 即WEB-INF下面的classes目录 ,在springboot项目中可能就是,src/main/resource 目录. 1,classpath 目录下-访问默认文件夹名为

  • SpringBoot静态资源css,js,img配置方案

    一.概述 springboot 默认静态资源访问的路径为:/static 或 /public 或 /resources 或 /META-INF/resources 这样的地址都必须定义在src/main/resources目录文件中,这样可以达到在项目启动时候可以自动加载为项目静态地址目录到classpath下 ,静态访问地址其实是使用 ResourceHttpRequestHandler 核心处理器加载到WebMvcConfigurerAdapter进行对addResourceHandlers

  • SpringBoot中的五种对静态资源的映射规则的实现

    SpringBoot中的SpringMVC配置功能都是在WebMvcAutoConfiguration类中,xxxxAutoConfiguration就是帮我们给容器中自动配置组件的:idea全局搜索的快捷键是两次shift,查看webMvcAutoConfiguration 查看webMvc自动配置类 WebMvcAutoConfiguration类的原理以后至少还要稍微掌握,而这里文章只是来看它的具体的关键代码,这里只例举部分关键代码,多了看着也头疼,看不懂没关系哈哈哈可跳过源码阶段,何必徒

  • springboot项目访问静态资源的配置代码实例

    这篇文章主要介绍了springboot项目访问静态资源的配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 这里只是简单记录当上传图片不是放在tomcat其他服务器中时,只是放在磁盘中便可以这样配置,在项目启动后可以访问到磁盘中的资源. @Configuration public class SystemConfigurer implements WebMvcConfigurer { @Value("${jeewx.path.uploa

  • 在SpringBoot中静态资源访问方法

    一.概述 springboot 默认静态资源访问的路径为:/static 或 /public 或 /resources 或 /META-INF/resources 这样的地址都必须定义在src/main/resources目录文件中,这样可以达到在项目启动时候可以自动加载为项目静态地址目录到classpath下 ,静态访问地址其实是使用 ResourceHttpRequestHandler 核心处理器加载到WebMvcConfigurerAdapter进行对addResourceHandlers

  • springBoot快速访问工程目录下的静态资源

    目录 1.牛刀小试 1.1 图片静态资源的访问 1.2 为静态资源添加访问前缀 1.3 WelCome Page 的奇妙跳转 2.那么,SpringBoot是如何做到的呢? 1.牛刀小试 1.1 图片静态资源的访问 先看官方怎么说,点击链接,打开SpringBoot官方文档 ​ 文档中明确指出:/static(or/publicor/resourcesor/META-INF/resources) ,这几个目录是SpringBoot放置静态资源的目录,只要把静态资源放到这几个目录下,就能直接访问到

  • Springboot 项目读取Resources目录下的文件(推荐)

    需求描述:企业开发过程中,经常需要将一些静态文本数据放到Resources目录下,项目启动时或者程序运行中,需要读取这些文件. 读取Resources目录下文件的方法 /** * @Description: 读取resources 目录下的文件 * @Author: ljj * @CreateDate: 2020/11/3 17:20 * @UpdateUser: * @UpdateDate: * @UpdateReakem * @param filePath * @Return: java.l

  • 详解直接访问WEB-INF目录下的JSP页面的方法

    WEB-INF目录下的JSP页面不能通过地址栏直接访问,WEB-INF目录下的文件不能直接被访问主要是出于安全考虑,当然如果不用考虑安全性的话,你可以直接把JSP页面放到WEB-INF外的webapp目录下,这样也可以直接访问.下面说下如何直接访问WEB-INF目录下的jsp页面 可以通过转发的方式访问,我用的是Controller来进行转发,如下: package com.sogou.baike.controller; import org.apache.log4j.Logger; impor

  • vue@cli3项目模板怎么使用public目录下的静态文件

    作为图片最好放在static目录下,但是vue@cli3没有static,网上都说放在public目录下,行,那就放吧,可问题是图片放了怎么使用 第一次尝试 肯定用绝对路径这就不说了,用相对路径,webpack会解析成base64,可是绝对路径怎么输都不对,咋回事 后面看网上说把前面路径下的public路径去掉,好,开发环境没问题了,可打包报错怎么办,就这个我研究了好久. 解决问题 网上一大堆牛头不对马嘴的,我也是无语了 最后的最后,终于官网找到了完美的解决方案 如此设置,完美解决问题,如果你留

  • springboot项目打成jar包后无法获取static下的静态资源文件的问题分析

    springboot 后端项目 做某个功能时 需要读取根目录下的.doc文件,具体项目中路径如下: 开始是通过绝对路径读取文档,在本地没有任何问题. 但是 讲项目打成jar包 部署到测试环境发现无论怎样都读取不到,然后在本地运行jar包出现同样的情况. 捕获异常:java.io.FileNotFoundException [org.apache.ibatis.session.defaults.DefaultSqlSession@55b40849] java.io.FileNotFoundExce

  • SpringBoot如何访问html和js等静态资源配置

    目录 SpringBoot访问html和js等静态资源配置 1:访问html 2:访问js SpringBoot访问不到js,css等静态资源问题 SpringBoot访问html和js等静态资源配置 把静态资源放到resources/static下,这是springboot静态资源默认访问路径. 在浏览器直接ip:端口/静态资源 就可以了 下面的废话是好久之前写的,不用看了... SpringBoo推荐使用thymeleaf模板作用前端页面展示,整体结构如下所示: 这里我并没有引入thymel

  • Spring Boot实战之静态资源处理

    前两章我们分享了Spring boot对Restful 的支持,不过Restful的接口通常仅仅返回数据.而做web开发的时候,我们往往会有很多静态资源,如html.图片.css等.那如何向前端返回静态资源呢?以前做过web开发的同学应该知道,我们以前创建的web工程下面会有一个webapp的目录,我们只要把静态资源放在该目录下就可以直接访问.但是,基于Spring boot的工程并没有这个目录,那我们应该怎么处理? 一.最笨的方式 我们首先来分享一种最笨的办法,就是将静态资源通过流直接返回给前

  • springboot访问静态资源遇到的坑及解决

    目录 访问静态资源遇到的坑及解决 直接访问静态资源的问题 SpringBoot 默认静态资源访问配置 引入shiro 或 security后的拦截过滤 访问静态资源遇到的坑及解决 开始是以这种结构进行的,结果页面上一篇红,访问的页面是这样的 最终找出来问题,虽然每次调整路径都不对,最终查看多种方法可以看到了: 增加: package com.example.demo.config; import org.springframework.stereotype.Component; import o

随机推荐