将新的UI更改部署到Spring Web应用程序时遇到缓存问题。静态资产(JS / CSS)URL未引用版本路径。有想法吗?
我已经编写了一个Spring MVC(4.3.5)Web应用程序,该应用程序使用Freemarker(2.3.28)进行模板化。我已经参考了许多有关使用Freemarker / Thymeleaf / Velocity在Spring MVC中对静态资产进行版本控制的资源。我目前正在使用VersionResourceResolver,其中包含用于CSS文件的ContentVersionStrategy和用于JS文件的FixedVersionStrategy。我还使用ResourceUrlEncodingFilter基本上将对版本化静态资产的请求转换为实际文件,以防止出现缓存问题。我在Freemarker中利用spring宏来获取我已版本化的静态资源的完整上下文路径。我引用的所有资源都指定要确切地利用我在代码中所做的工作,并且所有这些都显示出有效的产品。但是,我的应用程序仍然尝试检索非版本化的静态文件。带有静态资源URL的HTML文件尚未重写为版本化的URL,我已阅读的每个资源都显示了更改。
Spring MVC-4.3.5
Spring Security-3.2.0
Freemarker-2.3.28
码头-9.3.9
MvcConfiguration.java
...
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String version = "" + System.currentTimeMillis();
boolean cacheResources = !ConfigValue.SYSTEM_ENVIRONMENT.getValue().equals("DEV");
Map<String, VersionStrategy> resolverStrategies = new HashMap<>();
resolverStrategies.put("/**/*.css", new ContentVersionStrategy());
resolverStrategies.put("/**/*.js", new FixedVersionStrategy(version));
VersionResourceResolver versionResourceResolver = new VersionResourceResolver();
versionResourceResolver.setStrategyMap(resolverStrategies);
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/")
.cachePeriod(3600)
.resourceChain(cacheResources)
.addResolver(versionResourceResolver);
registry.addResourceHandler("/images/**").addResourceLocations("/images/");
registry.addResourceHandler("/static/**").addResourceLocations("/static/")
.cachePeriod(3600)
.resourceChain(cacheResources)
.addResolver(versionResourceResolver);
}
@Bean
public FreeMarkerConfig freemarkerConfig() {
FreeMarkerConfigurer config = new FreeMarkerConfigurer();
config.setTemplateLoaderPaths("/WEB-INF/views/", "/static/");
return config;
}
@Bean
public ViewResolver viewResolver(ContentNegotiationManager cnManager, ApplicationContext ctx) {
List<ViewResolver> resolvers = new ArrayList<>();
FreeMarkerViewResolver fmResolver = new FreeMarkerViewResolver();
fmResolver.setSuffix(".html");
fmResolver.setApplicationContext(ctx);
resolvers.add(fmResolver);
BeanNameViewResolver beanResolver = new BeanNameViewResolver();
beanResolver.setApplicationContext(ctx);
resolvers.add(beanResolver);
ContentNegotiatingViewResolver top = new ContentNegotiatingViewResolver();
top.setViewResolvers(resolvers);
top.setContentNegotiationManager(cnManager);
top.setApplicationContext(ctx);
return top;
}
...
web.xml
...
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelagatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>resourceUrlEncodingFilter</filter-name>
<filter-class>org.springframework.web.servlet.resource.ResourceUrlEncodingFilter
</filter>
<filter-mapping>
<filter-name>resourceUrlEncodingFilter</filter-name>
<url-pattern>/resources/*</url-pattern>
<url-pattern>/static/*</url-pattern>
</filter-mapping>
...
apps.html
...
<#import "spring.ftl" as spring />
<script src="<@spring.url '../resources/services.js'/>"></script>
<script src="<@spring.url '../resources/metrics.js'/>"></script>
<script src="<@spring.url '../resources/common.js'/>"></script>
<script src="<@spring.url '../static/apps/controllers/main.js'/>"></script>
<script src="<@spring.url '../static/apps/controllers/dashboard.js'/>"></script>
<link href="<@spring.url '../static/apps/apps.css'/>">
...
我希望脚本URL和链接hrefs可以转换为版本URL,而不是非版本URL。当前没有使用当前代码的情况。
示例
<script src="<@spring.url '../static/apps/controllers/dashboard.js'/>"></script>
应该转换为<script src="/static/<static-version>/apps/controllers/dashboard.js"></script>
,但是,它转换为<script src="/static/apps/controllers/dashboard.js"></script>
<link href="<@spring.url '../static/apps/apps.css'/>">
应该转换为<link href="/static/apps/apps-<md5-hash>.css">
,但是,它转换为<link href="/static/apps/apps.css">