小编典典

如何有选择地禁用用于Spring Boot的缓存(manifest.appcache)

spring-boot

从这个问题可以看出,Spring Security为Spring Boot管理缓存。从Spring
Boot 文档中,它显示了如何使用以下方法设置资源的缓存:

spring.resources.cache-period= # cache timeouts in headers sent to browser

cache- period为Spring Boot所有预定义的静态位置是伟大的(即/css**/js/**/images/**),但我也产生manifest.appcache了我的静态资产的离线下载,并且由于所有上述弹簧安全的/boot发回缓存头与manifest.appcache

"method": "GET",
"path": "/manifest.appcache",
"response": {
    "X-Application-Context": "application:local,flyway,oracle,kerberos:8080",
    "Expires": "Tue, 06 Oct 2015 16:59:39 GMT",
    "Cache-Control": "max-age=31556926, must-revalidate",
    "status": "304"
}

我想知道如何为添加排除对象manifest.appcache。IE和Chrome似乎对appcache都“做正确的事”,而不管我的头是什么,但是FF似乎在指出appcache何时更改以及我认为我的缓存头正在搞砸的时候显得有些奇怪。

编辑:我应该从WebMvcAutoConfiguration的源代码中添加它,它显示了如何为资源设置缓存,我只是不确定如何针对我的1种情况有选择地禁用w
/ o,这可能会破坏此文件中弹簧引导设置的其余部分。

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        if (!this.resourceProperties.isAddMappings()) {
            logger.debug("Default resource handling disabled");
            return;
        }

        Integer cachePeriod = this.resourceProperties.getCachePeriod();
        if (!registry.hasMappingForPattern("/webjars/**")) {
            registry.addResourceHandler("/webjars/**")
                    .addResourceLocations("classpath:/META-INF/resources/webjars/")
                    .setCachePeriod(cachePeriod);
        }
        if (!registry.hasMappingForPattern("/**")) {
            registry.addResourceHandler("/**")
                    .addResourceLocations(RESOURCE_LOCATIONS)
                    .setCachePeriod(cachePeriod);
        }
    }

阅读 586

收藏
2020-05-30

共1个答案

小编典典

感谢您的问与答!

我们遇到了类似的问题:所有浏览器(Chrome,Safari,IE)都没有缓存清单文件本身,而是在更改后重新加载了清单文件。

但是,在Spring Boot中设置缓存周期设置并不能完全解决问题。另外,我不想为Spring
Boot应用程序提供的所有文件设置缓存控制参数,而只是禁用清单的缓存。

我的解决方案包括两部分:

  1. 在清单文件中提供“修订”注释。尽管W3C规范未涵盖某些浏览器,但某些浏览器似乎想要这样的注释来检测清单或引用的(缓存的)文件中的更改:
    # rev 7
    

现在,我们通过Maven生成的唯一内部版本号更改缓存清单文件中的“
rev”参数:https
:
//github.com/dukecon/dukecon_html5/commit/b60298f0b856a7e54c97620f278982142e3e1f45)。

  1. 通过提供一个过滤器来禁用缓存,该过滤器将一个标题“ Cache-Control:no-cache”添加到确切的cache.manifest文件模式:https : //github.com/dukecon/dukecon_server/commit/dc02f26996cb172df804da007546f439df75126d
2020-05-30