【问题标题】:Is cache-control header changed by browser itself?浏览器本身是否更改了缓存控制标头?
【发布时间】: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


【解决方案1】:

回答我自己的问题:
该问题根本与响应标头无关。 我的应用程序中的所有 JSF 资源都具有以下 url 布局:

https://myserver/myapp/javax.faces.resource/jquery/jquery.js.xhtml?ln=primefaces&v=5.2

注意 jquery.js 之后的 xhtml 后缀 ?
我认为它是由 jsf 运行时自动添加的。

我的 web.xml 中还有以下内容:

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>All pages</web-resource-name>
      <description>Protects all resources</description>
      <url-pattern>*.xhtml</url-pattern>
    </web-resource-collection>
  </security-constraint>

显然这个安全限制导致 jsf 资源没有被 Internet Explorer 缓存。

在将 url 模式更改为 /mypages/* 而不是 *.xhtml 后,jquery.js 等 primefaces 资源以及其他资源(例如:h:graphicImage library="images")被正确缓存(http 304) Internet Explorer 10。

我仍然想解释一下为什么安全约束会干扰或改变 jsf 资源缓存的行为。 有人可以向我解释一下吗?

问候, 罗纳德·沃特斯

【讨论】:

  • 安全约束通常是基于会话的服务器端策略,处理请求的 HTTP 缓存可能不知道这些策略,或者如何应用它们。因此,在服务器端应用的安全约束通常意味着那些资源应该被缓存;只有服务器知道如何正确处理这些安全受限的资源。因此在响应中添加了no-cache 指令。希望这会有所帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 2016-08-14
  • 2015-01-16
相关资源
最近更新 更多