如何编写一个过滤器,以按照 Google 的建议适当缓存静态资源
如果您的意思是使用 JSF 资源 /resources 文件夹中的文件,这些文件完全由 JSF 内置资源处理程序 (and thus all referenced via <h:outputStylesheet>, <h:outputScript>, <h:graphicImage>, #{resource} and thus not via the plain HTML way) 处理,那么您不需要为该作业自行开发过滤器。要满足 Google 的建议,您唯一需要做的就是将Expires 日期设置得更远一点。即默认为 7 天(604800000 毫秒),而 Google Page Speed 和 Yahoo YSlow 等性能测试工具建议至少 30 天(2592000000 毫秒)。
在 Mojarra 中,您可以使用 web.xml 中的以下上下文参数进行设置:
<context-param>
<param-name>com.sun.faces.defaultResourceMaxAge</param-name>
<param-value>2592000000</param-value> <!-- 30 days -->
</context-param>
在 MyFaces 中使用以下一个:
<context-param>
<param-name>org.apache.myfaces.RESOURCE_MAX_TIME_EXPIRES</param-name>
<param-value>2592000000</param-value> <!-- 30 days -->
</context-param>
创建一个将最后修改日期设置为某个静态日期的过滤器是否足够(每次服务器重新启动时都会更改)?
您不需要也不应该设置Last-Modified。 JSF 资源处理程序已经自动执行此操作。如果您因为更改了资源而想强制重新加载资源,请使用资源库版本控制。另见What is the JSF resource library for and how should it be used?
请注意,每次服务器重新启动时更改它是没有意义的,因为 Expires 标头仍会一直告诉浏览器仅在一段时间后重新测试缓存的有效性。在浏览器真正请求资源之前,浏览器永远不会注意到资源的Last-Modified 的变化。唯一迫使浏览器难以完全重新请求资源的是 URL 的更改,通常通过更改查询字符串参数值来实现。 JSF 资源库版本控制正是这样做的。
另请注意,OmniFaces CombinedResourceHandler 使用资源的最后修改时间戳作为查询字符串中的“资源版本”,而不是资源库版本。因此,如果您使用它,则不一定需要资源库版本控制机制。
上面的链接似乎建议您需要指定 Expires 或 Cache-Control。为什么有必要这样做?
Expires 标头告诉浏览器何时通过条件 GET 请求重新测试缓存资源的有效性。因此,在此之前,浏览器不会这样做,并将继续使用缓存中的那个。 Cache-Control 告诉浏览器使用哪种缓存策略。请注意,当它设置为例如no-cache 而不是 public,那么 Expires 标头将无效。另请注意,缺少 Cache-Control 标头意味着 public(由 JSF 资源完成)。