Как исправить статические URL-адреса ресурсов (JS / CSS), не заменяя версионные URL-адреса - PullRequest
0 голосов
/ 23 января 2019

У меня возникают проблемы с кэшированием при развертывании новых изменений пользовательского интерфейса в моем веб-приложении 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">

...