04-SpringBoot之静态资源映射处理以及静态资源路径的作用

静态资源映射处理以及静态资源路径的作用

一、静态资源映射配置

1. 静态资源映射在SpringBoot中的自动配置

WebMvcAutoConfiguration:
	// 增加资源处理器---实际上就是增加资源路径的映射关系,比如访问地址/,将会映射到服务器的哪个文件夹下
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 当spring.resources.add-mappings为false时(默认为true),直接日志输出以及结束函数,不会将下面的静态资源路径加入到注册器中
        if (!this.resourceProperties.isAddMappings()) {
            logger.debug("Default resource handling disabled");
            return;
        }
        // 反之spring.resources.add-mappings为true
        Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
        CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
        // 如果注册器中不存在/webjars/**这个路径的映射,则将这个classpath:/META-INF/resources/webjars/资源路径映射到/webjars/**访问路径,webjars这个路径用于存放将静态资源打包成jar包后的资源,这里不做具体说明(不常用)
        if (!registry.hasMappingForPattern("/webjars/**")) {
            customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
                                                 .addResourceLocations("classpath:/META-INF/resources/webjars/")
                                                 .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
        }
        // 获取mvc配置类中的静态路径(默认为/**)
        String staticPathPattern = this.mvcProperties.getStaticPathPattern();
        // 如果这个路径在注册器中没有映射
        if (!registry.hasMappingForPattern(staticPathPattern)) {
            // 将resource配置类中的静态资源路径(默认为"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/")映射到mvc配置类中的静态路径(默认为/**),这里相当于当我们访问 / 路径下的文件时,会将其映射到前面的静态资源路径
            customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)                                     .addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
                                                 .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
        }
    }
// 经过上面配置类的加载(自动配置)后,我们可以将静态资源放在以下的路径下供于静态资源的访问。
// addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
"classpath:/META-INF/resources/",
"classpath:/resources/", 
"classpath:/static/", 
"classpath:/public/"

这些路径默认会被映射到/**(registry.addResourceHandler(staticPathPattern))
比如访问 http://localhost:8080/1.js 将会访问上面这些路径下的1.js文件
优先级以此递减(如果/META-INF/resources/中有对应文件,就不会去resources、static、public目录下找文件)


或者通过加入webjar的依赖包再访问如http://localhost:8080/webjars/jquery/3.4.1/jquery.js这个路径进行静态资源的访问(不常用)

04-SpringBoot之静态资源映射处理以及静态资源路径的作用
04-SpringBoot之静态资源映射处理以及静态资源路径的作用

2.使用自定义的映射

所有自定义配置

注意:使用自定义映射之后,自动配置的静态资源映射将失效(因为会进行覆盖)

spring:
  mvc:
    static-path-pattern: /**
  resources:
    static-locations: classpath:/hello/, classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/
    
# 这里实际上就是修改了自动配置中的这部分参数customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))

04-SpringBoot之静态资源映射处理以及静态资源路径的作用

二、欢迎页映射—基于静态资源映射的欢迎页

WebMvcAutoConfiguration:
	// 欢迎页处理映射
	@Bean
    public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
                                                               FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
        // 实例化欢迎页处理映射,在这里指定了访问路径(this.mvcProperties.getStaticPathPattern()---前面配置好的mvc配置类中的静态路径/**)以及资源路径(getWelcomePage()---实际上就是前面配置好的静态资源路径下的index.html这个文件)
        WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
            new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
            this.mvcProperties.getStaticPathPattern());
        welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
        welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
        return welcomePageHandlerMapping;
    }

	// 欢迎页处理映射构造函数
	WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,
			ApplicationContext applicationContext, Optional<Resource> welcomePage, String staticPathPattern) {
        // 注意这里只有当staticPathPattern=/**时才会加载欢迎页
		if (welcomePage.isPresent() && "/**".equals(staticPathPattern)) {
			logger.info("Adding welcome page: " + welcomePage.get());
			setRootViewName("forward:index.html");
		}
		else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {
			logger.info("Adding welcome page template: index");
			setRootViewName("index");
		}
	}

当我们访问静态资源路径时(http://localhost:8080/)时,将会在静态资源路径下面寻找index.html文件,并将其作为欢迎页(首页)返回,注意这里不能修改spring.mvc.static-path-pattern,否则将无法自动配置欢迎页

三、图标Favicon------在SpringBoot2.x中被移除(可能会导致网站信息泄露)

上一篇:BUAA 面向对象课程 第四单元总结以及课程总结


下一篇:SpringBoot—数据库初始化脚本配置