靜態資源的處理和默認首頁的定義

靜態資源的處理和默認首頁的定義

靜態資源

  1. springboot默認從classpath下的/static (or /public or /resources or /META-INF/resources)目錄或者ServletContext的根目錄提供靜態內容。我們可以通過添加自己的 WebMvcConfigurer(實現 WebMvcConfigurer 接口)並且重寫 addResourceHandlers方法去修改默認行爲。也可以修改如下配置指定。

  2. 靜態資源的位置可以改變 通過如下屬性:

    spring.resources.static-locations
    
  3. 靜態資源默認的映射地址 /** ,如果想修改默認的映射地址爲/resources/**

spring.mvc.static-path-pattern=/resources/**
  1. 其他主要配置關注 ResourcePropertiesWebMvcProperties這兩個類

    @ConfigurationProperties(prefix = "spring.mvc")
    public class WebMvcProperties {	
    
    /**
    	 * Path pattern used for static resources.
    	 */
    	private String staticPathPattern = "/**";
        
        
    }
    
    @ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
    public class ResourceProperties {
        
        private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
    			"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
        
        /**
    	 * Whether to enable default resource handling.
    	 */
    	private boolean addMappings = true;
        
    }
    
  2. 以上功能具體實現

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnWebApplication(type = Type.SERVLET)
    @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
    @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
    @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
    @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
    		ValidationAutoConfiguration.class })
    public class WebMvcAutoConfiguration {
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
       if (!this.resourceProperties.isAddMappings()) {
          logger.debug("Default resource handling disabled");
          return;
       }
       Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
       CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
       if (!registry.hasMappingForPattern("/webjars/**")) {
          customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/")
                .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
       }
       String staticPathPattern = this.mvcProperties.getStaticPathPattern();
       if (!registry.hasMappingForPattern(staticPathPattern)) {
          customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
                .addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
                .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
       }
       /**
       *歡迎頁的加載
       */
       @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));
     	return welcomePageHandlerMapping;
     }
    }
    

    默認的歡迎頁(首頁)

  3. springboot默認從配置靜態資源的位置去找index.html作爲首頁。

    1. 具體實現

      final class WelcomePageHandlerMapping extends AbstractUrlHandlerMapping {
      
      	private static final Log logger = LogFactory.getLog(WelcomePageHandlerMapping.class);
      
      	private static final List<MediaType> MEDIA_TYPES_ALL = Collections.singletonList(MediaType.ALL);
      
      	WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,
      			ApplicationContext applicationContext, Optional<Resource> welcomePage, String 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");
      		}
      	}
      
      

注意: staticPathPattern沒有被修改默認值/**時,纔會加載到默認的首頁,如修改過staticPathPattern需自定義默認的首頁。
3. 自定義默認首頁

     ```java
     @Configuration
     public class WebMvcConfig implements WebMvcConfigurer {
         @Override
         public void addViewControllers(ViewControllerRegistry registry) {
             registry.addViewController("/").setViewName("forward:login.html");
         }
     }
     ```
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章