如何修复未用版本化URL替换的静态资产(JS / CSS)URL

时间:2019-01-23 15:48:19

标签: spring spring-mvc spring-security jetty freemarker

将新的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">

0 个答案:

没有答案