【发布时间】:2016-02-14 22:04:12
【问题描述】:
在我的 servlet 过滤器中,我设置了以下响应标头以启用某些资源的缓存:
Cache-Control: public,max-age=604800,must-revalidate
当我查看 Google Chrome 版本 46 中的响应标头时,我可以看到与上述缓存控制标头相同的值。 Chrome 还显示 GET 200 (from cache) 0ms。
但是,Firefox 38 显示 GET 304,令我惊讶的是 Cache-Control: "no-cache" 作为缓存控制标头的值,而不是我的 servlet 过滤器设置的值。
Internet Explorer 10 显示 GET 200 以及“no-cache”作为缓存控制标头的值。
那么,您能否向我解释一下为什么或如何在我的 servlet 过滤器(在部署在 JBoss AS 7 上的 JSF/PrimeFaces 应用程序中)中设置的值作为 http 响应标头,在 chrome 中显示为未修改但在 firefox 中更改和IE。 我自己没有编写任何可能覆盖此标头的 javascript。 我实际上是在尝试为提到的所有三个浏览器启用“相同”的缓存策略。
问候, 罗纳德·沃特斯。
【问题讨论】:
-
您是否尝试过使用“普通”html 页面?我怀疑这是 jsf 或 PrimeFaces 相关的(为什么没有 servlet-filter 标签顺便说一句?)如果这个过滤器是本土的,也许showcase.omnifaces.org/filters/CacheControlFilter 是一个不错的选择
-
实际上 CacheControlFilter 是我检查的第一件事,但它实际上跳过了 jsf 资源 (javax.faces.resource)。我希望 IE 缓存诸如 jquery.js 之类的 primefaces 资源,或者至少发送一个有条件的 get 查询。
-
它会跳过资源,因为它们已经由上面提到的 resourceHandler 处理。由于资源中有版本控制,跳过它们并让正常的 resourceHandler 处理它至少对我们来说工作得很好(否则 BalusC 会优化它;-)
-
“普通”资源处理程序和资源实现(com.sun.faces.application.resource.ResourceHandlerImpl,尤其是 jsf-impl jar 中的 ResourceImpl 本身)检查 if-modified-since 请求标头。如果之前“收到”了“无缓存”响应标头,则 IE 不会发送该请求标头。这就是为什么,至少在我的情况下,IE10 不发送条件获取,也不缓存来自 ln=primefaces 的任何资源。这就是我最初的问题。
-
嗯,我们从来没有听说过 IE10 的问题,但是如果我找到时间我会在周末检查,但我们从不发送无缓存资源,所以也许我们没有遇到这个或者我失败了查看 tge 问题
标签: jsf primefaces servlet-filters cache-control