From 4de86e1401068004fae8a6b537cae8fe9741a42e Mon Sep 17 00:00:00 2001
From: Brian Clozel
Date: Thu, 1 Dec 2016 12:07:47 +0100
Subject: [PATCH] Configure a cache busting resource chain
This commit configures a resource chain with
`resources.chain.strategy.content.enabled`, enabling cache busting for
static resources based on the hash of their content.
A template helper (here a Groovy Closure) is added to the model given to
the view for appending hashes to static links such as:
"/css/spring.css" -> "/css/spring-d35c4193cd32e7e44cda5737205c0c0e.css"
Fixes #321
---
.../initializr/service/InitializrService.groovy | 4 +++-
.../src/main/resources/application.yml | 5 +++++
.../InitializrAutoConfiguration.groovy | 6 +++++-
.../project/AbstractInitializrController.groovy | 8 ++++++++
.../web/project/LegacyStsController.groovy | 6 ++++--
.../initializr/web/project/MainController.groovy | 7 +++++--
.../src/main/resources/templates/home.html | 14 +++++++-------
7 files changed, 37 insertions(+), 13 deletions(-)
diff --git a/initializr-service/src/main/groovy/io/spring/initializr/service/InitializrService.groovy b/initializr-service/src/main/groovy/io/spring/initializr/service/InitializrService.groovy
index f6167fd7..39a74473 100644
--- a/initializr-service/src/main/groovy/io/spring/initializr/service/InitializrService.groovy
+++ b/initializr-service/src/main/groovy/io/spring/initializr/service/InitializrService.groovy
@@ -29,6 +29,7 @@ import org.springframework.context.annotation.Configuration
import org.springframework.scheduling.annotation.AsyncConfigurerSupport
import org.springframework.scheduling.annotation.EnableAsync
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
+import org.springframework.web.servlet.resource.ResourceUrlProvider
/**
* Initializr service application. Enables legacy STS support for older
@@ -47,8 +48,9 @@ class InitializrService {
@Bean
@SuppressWarnings("deprecation")
LegacyStsController legacyStsController(InitializrMetadataProvider metadataProvider,
+ ResourceUrlProvider resourceUrlProvider,
GroovyTemplate groovyTemplate) {
- new LegacyStsController(metadataProvider, groovyTemplate)
+ new LegacyStsController(metadataProvider, resourceUrlProvider, groovyTemplate)
}
@Configuration
diff --git a/initializr-service/src/main/resources/application.yml b/initializr-service/src/main/resources/application.yml
index 10788dcf..528392d4 100644
--- a/initializr-service/src/main/resources/application.yml
+++ b/initializr-service/src/main/resources/application.yml
@@ -13,6 +13,11 @@ spring:
jackson:
serialization:
write-dates-as-timestamps: false
+ resources:
+ chain:
+ strategy:
+ content:
+ enabled: true
initializr:
env:
diff --git a/initializr-web/src/main/groovy/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.groovy b/initializr-web/src/main/groovy/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.groovy
index eeebc312..fb314ba7 100644
--- a/initializr-web/src/main/groovy/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.groovy
+++ b/initializr-web/src/main/groovy/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.groovy
@@ -16,6 +16,8 @@
package io.spring.initializr.web.autoconfigure
+import org.springframework.web.servlet.resource.ResourceUrlProvider
+
import java.util.concurrent.TimeUnit
import com.github.benmanes.caffeine.cache.Caffeine
@@ -77,9 +79,11 @@ class InitializrAutoConfiguration {
@ConditionalOnMissingBean
MainController initializrMainController(InitializrMetadataProvider metadataProvider,
GroovyTemplate groovyTemplate,
+ ResourceUrlProvider resourceUrlProvider,
ProjectGenerator projectGenerator,
DependencyMetadataProvider dependencyMetadataProvider) {
- new MainController(metadataProvider, groovyTemplate, projectGenerator, dependencyMetadataProvider)
+ new MainController(metadataProvider, groovyTemplate, resourceUrlProvider
+ , projectGenerator, dependencyMetadataProvider)
}
@Bean
diff --git a/initializr-web/src/main/groovy/io/spring/initializr/web/project/AbstractInitializrController.groovy b/initializr-web/src/main/groovy/io/spring/initializr/web/project/AbstractInitializrController.groovy
index 8a36a46a..2885f8ac 100644
--- a/initializr-web/src/main/groovy/io/spring/initializr/web/project/AbstractInitializrController.groovy
+++ b/initializr-web/src/main/groovy/io/spring/initializr/web/project/AbstractInitializrController.groovy
@@ -16,6 +16,8 @@
package io.spring.initializr.web.project
+import org.springframework.web.servlet.resource.ResourceUrlProvider
+
import javax.servlet.http.HttpServletResponse
import io.spring.initializr.generator.InvalidProjectRequestException
@@ -36,12 +38,15 @@ abstract class AbstractInitializrController {
protected final InitializrMetadataProvider metadataProvider
private final GroovyTemplate groovyTemplate
+ private final Closure linkTo
private Boolean forceSsl
protected AbstractInitializrController(InitializrMetadataProvider metadataProvider,
+ ResourceUrlProvider resourceUrlProvider,
GroovyTemplate groovyTemplate) {
this.metadataProvider = metadataProvider
this.groovyTemplate = groovyTemplate
+ this.linkTo = { link -> resourceUrlProvider.getForLookupPath(link)?:link }
}
boolean isForceSsl() {
@@ -79,6 +84,9 @@ abstract class AbstractInitializrController {
// Google analytics support
model['trackingCode'] = metadata.configuration.env.googleAnalyticsTrackingCode
+ // Linking to static resources
+ model['linkTo'] = this.linkTo
+
groovyTemplate.process templatePath, model
}
diff --git a/initializr-web/src/main/groovy/io/spring/initializr/web/project/LegacyStsController.groovy b/initializr-web/src/main/groovy/io/spring/initializr/web/project/LegacyStsController.groovy
index a5dfdaaa..5d245f4f 100644
--- a/initializr-web/src/main/groovy/io/spring/initializr/web/project/LegacyStsController.groovy
+++ b/initializr-web/src/main/groovy/io/spring/initializr/web/project/LegacyStsController.groovy
@@ -22,6 +22,7 @@ import io.spring.initializr.util.GroovyTemplate
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseBody
+import org.springframework.web.servlet.resource.ResourceUrlProvider
/**
* A controller used to serve the legacy home page used by STS.
@@ -33,8 +34,9 @@ import org.springframework.web.bind.annotation.ResponseBody
@Deprecated
class LegacyStsController extends AbstractInitializrController {
- LegacyStsController(InitializrMetadataProvider metadataProvider, GroovyTemplate groovyTemplate) {
- super(metadataProvider, groovyTemplate)
+ LegacyStsController(InitializrMetadataProvider metadataProvider, ResourceUrlProvider resourceUrlProvider,
+ GroovyTemplate groovyTemplate) {
+ super(metadataProvider, resourceUrlProvider, groovyTemplate)
}
@RequestMapping(value = '/sts', produces = 'text/html')
diff --git a/initializr-web/src/main/groovy/io/spring/initializr/web/project/MainController.groovy b/initializr-web/src/main/groovy/io/spring/initializr/web/project/MainController.groovy
index c7767843..616f6939 100644
--- a/initializr-web/src/main/groovy/io/spring/initializr/web/project/MainController.groovy
+++ b/initializr-web/src/main/groovy/io/spring/initializr/web/project/MainController.groovy
@@ -16,6 +16,8 @@
package io.spring.initializr.web.project
+import org.springframework.web.servlet.resource.ResourceUrlProvider
+
import java.nio.charset.StandardCharsets
import java.util.concurrent.TimeUnit
@@ -74,8 +76,9 @@ class MainController extends AbstractInitializrController {
private final CommandLineHelpGenerator commandLineHelpGenerator
MainController(InitializrMetadataProvider metadataProvider, GroovyTemplate groovyTemplate,
- ProjectGenerator projectGenerator, DependencyMetadataProvider dependencyMetadataProvider) {
- super(metadataProvider, groovyTemplate)
+ ResourceUrlProvider resourceUrlProvider, ProjectGenerator projectGenerator,
+ DependencyMetadataProvider dependencyMetadataProvider) {
+ super(metadataProvider, resourceUrlProvider, groovyTemplate)
this.projectGenerator = projectGenerator
this.dependencyMetadataProvider = dependencyMetadataProvider
this.commandLineHelpGenerator = new CommandLineHelpGenerator(groovyTemplate)
diff --git a/initializr-web/src/main/resources/templates/home.html b/initializr-web/src/main/resources/templates/home.html
index c0a4ec2f..59dc4969 100644
--- a/initializr-web/src/main/resources/templates/home.html
+++ b/initializr-web/src/main/resources/templates/home.html
@@ -3,9 +3,9 @@
Spring Initializr
-
-
-
+
+
+
@@ -170,10 +170,10 @@
and Pivotal Web Services
-
-
-
-
+
+
+
+
<% if (trackingCode) { %>