一、前言

如果要自定义首页,应该如何操作

二、读源码

1、HandlerMapping

处理器映射。保存了每一个Handler能处理哪些请求。

2、 WelcomePageHandlerMapping

处理欢迎页index.html映射

  1. @Bean
  2. public WelcomePageHandlerMapping welcomePageHandlerMapping(
  3. ApplicationContext applicationContext,
  4. FormattingConversionService mvcConversionService,
  5. ResourceUrlProvider mvcResourceUrlProvider) {
  6. WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
  7. new TemplateAvailabilityProviders(applicationContext)
  8. , applicationContext
  9. ,this.getWelcomePage()
  10. ,this.mvcProperties.getStaticPathPattern());
  11. welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
  12. welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
  13. return welcomePageHandlerMapping;
  14. }

1)@Bean注解,注册WelcomePageHandlerMapping为bean时,会用构造器初始化
2)构造器初始化参数:

  • this.getWelcomePage()
  • this.mvcProperties.getStaticPathPattern()

this.getWelcomePage():
欢迎页存放位置,同静态资源存放的位置:

  • classpath:/META-INF/resources/,
  • classpath:/resources/,
  • classpath:/static/,
  • classpath:/public/

image.png
image.png

this.mvcProperties.getStaticPathPattern() :访问index.html时,默认为/**
image.png
但如果我们自行配置了前缀,会使欢迎页失效

  1. spring:
  2. # mvc:
  3. # static-path-pattern: /res/** 这个会导致welcome page功能失效
  4. resources:
  5. static-locations: [classpath:/haha/]

失效原因,见WelcomePageHandlerMapping的构造器源码

3)构造器源码

  1. WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders, ApplicationContext applicationContext, Resource welcomePage, String staticPathPattern) {
  2. //welcomePage 是从各个静态资源路径下找到的 index.html 资源
  3. if (welcomePage != null && "/**".equals(staticPathPattern)) {
  4. //要用欢迎页功能,必须是/**
  5. logger.info("Adding welcome page: " + welcomePage);
  6. this.setRootViewName("forward:index.html");
  7. } else if (this.welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {
  8. // 调用Controller /index
  9. logger.info("Adding welcome page template: index");
  10. this.setRootViewName("index");
  11. }
  12. }

三、结论

欢迎页

  • 静态资源路径下存放 index.html
    • 可以配置静态资源路径
    • 但是不可以配置静态资源的访问前缀(默认是/**)。否则导致 index.html不能被默认访问
  • controller能处理/index

图标

  • 早些版本中Spring Boot对Favicon进行了默认支持,只需要将.ico图标文件放在四个静态资源目录任意一个即可,并需要在application.properties中通过如下配置关闭默认的图标即可
  • spring.mvc.favicon.enabled=false #关闭
  • 但在Spring Boot项目的issues中提出,如果提供默认的Favicon可能会导致网站信息泄露。如果用户不进行自定义的Favicon的设置,而Spring Boot项目会提供默认的上图图标,那么势必会导致泄露网站的开发框架。
  • 因此,在Spring Boot2.2.x中,将默认的favicon.ico移除

image.png
在这以后,我们需要在index.html首页文件中进行配置

四、测试

在静态资源路径下建立index.html 文件,然后启动项目访问
image.png

将图标图片 favicon.ico 放在静态资源路径下,然后修改index.html 文件,重启项目,然后换个浏览器(或者清空常用浏览器缓存)访问,就可以看见修改的图标
image.png