Skip to content

Commit

Permalink
Remove default favicon and support for serving from classpath root
Browse files Browse the repository at this point in the history
Closes gh-17925
  • Loading branch information
wilkinsona committed Aug 22, 2019
1 parent e03f822 commit 05e0896
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -332,27 +332,6 @@ public static RequestContextFilter requestContextFilter() {
return new OrderedRequestContextFilter();
}

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "spring.mvc.favicon.enabled", matchIfMissing = true)
public static class FaviconConfiguration implements WebMvcConfigurer {

private final ResourceProperties resourceProperties;

FaviconConfiguration(ResourceProperties resourceProperties) {
this.resourceProperties = resourceProperties;
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!registry.hasMappingForPattern("favicon.ico")) {
registry.addResourceHandler("favicon.ico")
.addResourceLocations(this.resourceProperties.getStaticLocations())
.addResourceLocations("classpath:favicon.ico");
}
}

}

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -699,12 +699,6 @@
"name": "spring.mustache.suffix",
"defaultValue": ".mustache"
},
{
"name": "spring.mvc.favicon.enabled",
"type": "java.lang.Boolean",
"description": "Whether to enable resolution of favicon.ico.",
"defaultValue": true
},
{
"name": "spring.mvc.formcontent.putfilter.enabled",
"type": "java.lang.Boolean",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ void resourceHandlerMappingOverrideAll() {
@Test
void resourceHandlerMappingDisabled() {
this.contextRunner.withPropertyValues("spring.resources.add-mappings:false")
.run((context) -> assertThat(getResourceMappingLocations(context)).hasSize(1));
.run((context) -> assertThat(getResourceMappingLocations(context)).hasSize(0));
}

@Test
Expand Down Expand Up @@ -378,21 +378,6 @@ void customContentNegotiatingViewResolver() {
.containsOnly("myViewResolver"));
}

@Test
void faviconMapping() {
this.contextRunner.run((context) -> {
List<Resource> favIconResources = getResourceMappingLocations(context).get("/favicon.ico");
assertThat(favIconResources.stream().map(ClassPathResource.class::cast).map(ClassPathResource::getPath))
.containsExactly("META-INF/resources/", "resources/", "static/", "public/", "favicon.ico");
});
}

@Test
void faviconMappingDisabled() {
this.contextRunner.withPropertyValues("spring.mvc.favicon.enabled:false")
.run((context) -> assertThat(getResourceMappingLocations(context).get("/favicon.ico")).isNull());
}

@Test
void defaultAsyncRequestTimeout() {
this.contextRunner.run((context) -> assertThat(ReflectionTestUtils
Expand Down Expand Up @@ -660,14 +645,12 @@ void cachePeriod() {

private void assertCachePeriod(AssertableWebApplicationContext context) {
Map<String, Object> handlerMap = getHandlerMap(context.getBean("resourceHandlerMapping", HandlerMapping.class));
assertThat(handlerMap).hasSize(3);
assertThat(handlerMap).hasSize(2);
for (Entry<String, Object> entry : handlerMap.entrySet()) {
if (!entry.getKey().equals("/favicon.ico")) {
Object handler = entry.getValue();
if (handler instanceof ResourceHttpRequestHandler) {
assertThat(((ResourceHttpRequestHandler) handler).getCacheSeconds()).isEqualTo(5);
assertThat(((ResourceHttpRequestHandler) handler).getCacheControl()).isNull();
}
Object handler = entry.getValue();
if (handler instanceof ResourceHttpRequestHandler) {
assertThat(((ResourceHttpRequestHandler) handler).getCacheSeconds()).isEqualTo(5);
assertThat(((ResourceHttpRequestHandler) handler).getCacheControl()).isNull();
}
}
}
Expand Down Expand Up @@ -784,7 +767,7 @@ void customPrinterAndParserShouldBeRegisteredAsConverters() {

private void assertCacheControl(AssertableWebApplicationContext context) {
Map<String, Object> handlerMap = getHandlerMap(context.getBean("resourceHandlerMapping", HandlerMapping.class));
assertThat(handlerMap).hasSize(3);
assertThat(handlerMap).hasSize(2);
for (Object handler : handlerMap.keySet()) {
if (handler instanceof ResourceHttpRequestHandler) {
assertThat(((ResourceHttpRequestHandler) handler).getCacheSeconds()).isEqualTo(-1);
Expand All @@ -795,7 +778,12 @@ private void assertCacheControl(AssertableWebApplicationContext context) {
}

protected Map<String, List<Resource>> getResourceMappingLocations(ApplicationContext context) {
return getMappingLocations(context.getBean("resourceHandlerMapping", HandlerMapping.class));
Object bean = context.getBean("resourceHandlerMapping");
if (bean instanceof HandlerMapping) {
return getMappingLocations(context.getBean("resourceHandlerMapping", HandlerMapping.class));
}
assertThat(bean.toString()).isEqualTo("null");
return Collections.emptyMap();
}

protected List<ResourceResolver> getResourceResolvers(ApplicationContext context, String mapping) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2508,9 +2508,9 @@ welcome page of the application.

[[boot-features-spring-mvc-favicon]]
==== Custom Favicon
Spring Boot looks for a `favicon.ico` in the configured static content locations and the
root of the classpath (in that order). If such a file is present, it is automatically
used as the favicon of the application.
As with other static resources, Spring Boot looks for a `favicon.ico` in the configured
static content locations. If such a file is present, it is automatically used as the
favicon of the application.


[[boot-features-spring-mvc-pathmatch]]
Expand Down
Binary file not shown.

0 comments on commit 05e0896

Please sign in to comment.