如何有选择地禁用spring boot(manifest.appcache)的缓存

时间:2014-10-06 12:58:36

标签: spring-boot html5-appcache

从这个question可以看出Spring安全管理弹出启动的缓存。从spring boot documentation开始,它显示了如何使用以下命令设置资源缓存:

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

cache-period非常适合春季启动的所有预定义静态位置(即/css**/js/**/images/**),但我也生成{ {1}}用于离线下载我的静态资产,并且由于上述所有spring security / boot都发送了带有manifest.appcache的缓存头

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" } 添加排除项。 IE和Chrome似乎做了正确的事情'使用appcache而不管我的标题,但是当注意到appcache发生了变化并且我认为我的缓存标题搞砸了时,FF似乎更加特别。

编辑: 我应该从WebMvcAutoConfiguration的源代码中添加它,它显示了如何为资源设置缓存,我只是不确定如何选择性地禁用我的1个案例,而不会破坏Spring引导集的其余部分在这个文件中。

manifest.appcache

3 个答案:

答案 0 :(得分:3)

基于this answer详细说明IE需要" max-age = 1,必须重新验证",并通过在所有浏览器上进行测试,设置属性值

spring.resources.cache-period=1

将允许写入正确的http标头,以便正确处理appcache清单。它不是我希望的解决方案(能够使用正确的标头来设置缓存周期为0),但它确实使浏览器正常运行并正确使用appcache清单。

再次总结一下解决方案的背景 - 这是我的应用程序离线下载所有资产(js / css / html)并从appcache提供服务。

答案 1 :(得分:2)

感谢Q和A!

我们遇到了类似的问题:所有浏览器(Chrome,Safari,IE)只有一个(FF)没有自己缓存清单文件,但在更改后重新加载。

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

我的解决方案由两部分组成:

  1. 在清单文件中提供“rev”注释。虽然W3C spec没有涵盖,但某些浏览器似乎想要这样的注释来检测清单或引用(缓存)文件中的更改:

    https

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

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

答案 2 :(得分:2)

在当前版本(2016年2月)中,无需在代码中执行某些操作来更改默认行为。 只需在application.properties中进行一些配置:

# Enable HTML5 application cache manifest rewriting.
spring.resources.chain.html-application-cache=true

# Enable the Spring Resource Handling chain. Disabled by default unless at least one strategy has been enabled.
spring.resources.chain.enabled=true
# Enable the content Version Strategy.
spring.resources.chain.strategy.content.enabled=true 
# Comma-separated list of patterns to apply to the Version Strategy.
spring.resources.chain.strategy.content.paths=/** 

# Locations of static resources.
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

这就是全部。现在,Spring将检查您的静态文件是否已更改,并且可以发送更智能的响应(If-Modiffied-Since和其他)并重写您的appcache。

此外,如果有理由不对某些资源使用基于内容的版本 - 您可以使用备用FixedVersion策略并在配置中明确设置版本:

#Enable the fixed Version Strategy.
spring.resources.chain.strategy.fixed.enabled=false 
# Comma-separated list of patterns to apply to the Version Strategy.
spring.resources.chain.strategy.fixed.paths= 
# Version string to use for the Version Strategy.
spring.resources.chain.strategy.fixed.version= 

P.S。不要忘记Spring Security:它会重写缓存标头并禁用缓存。

docs

中查看详情