У меня возникают проблемы с кэшированием при развертывании новых изменений пользовательского интерфейса в моем веб-приложении Spring.URL-адреса статических ресурсов (JS / CSS) не ссылаются на версионные пути.Мысли?
Я написал веб-приложение Spring MVC (4.3.5), которое использует Freemarker (2.3.28) для шаблонных целей.Я ссылался на множество ресурсов в отношении создания версий статических ресурсов в Spring MVC с использованием Freemarker / Thymeleaf / Velocity.В настоящее время я использую VersionResourceResolver, который содержит ContentVersionStrategy для моих файлов CSS и FixedVersionStrategy для моих файлов JS.Я также использую ResourceUrlEncodingFilter для преобразования запроса статических ресурсов с версией в реальный файл для предотвращения проблем с кэшированием.Я использую макрос Spring в Freemarker, чтобы получить полный контекстный путь к статическим ресурсам, которые я версировал.Все ресурсы, на которые я ссылался, указывают на использование именно того, что я сделал в коде, и все они показывают работающий продукт.Мое приложение, однако, все еще пытается получить не версионные статические файлы.HTML-файлы со статическими URL-адресами ресурсов не были перезаписаны на версионные 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-адреса сценариев и ссылки будут переведены на версионный 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">