如何编写一个过滤器,以按照 Google 的建议适当缓存静态资源
如果您的意思是 JSF 资源文件/resources
夹中的文件完全由 JSF 内置资源处理程序处理(因此所有文件都通过<h:outputStylesheet>
, <h:outputScript>
,引用<h:graphicImage>
,#{resource}
因此不是通过纯 HTML 方式),那么您不需要为工作。要满足 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 资源处理程序已经自动执行此操作。如果您因为更改了资源而想强制重新加载资源,请使用资源库版本控制。另请参阅JSF 资源库的用途是什么以及应该如何使用它?
请注意,每次服务器重新启动时更改它是没有意义的,因为Expires
标头仍会一直告诉浏览器仅在一段时间后重新测试缓存的有效性。在浏览器真正请求资源之前,浏览器永远不会注意到Last-Modified
资源的变化。唯一迫使浏览器难以完全重新请求资源的是 URL 的更改,通常通过更改查询字符串参数值来实现。JSF 资源库版本控制正是这样做的。
另请注意,OmniFacesCombinedResourceHandler
使用资源的最后修改时间戳作为查询字符串中的“资源版本”,而不是资源库版本。因此,如果您使用它,则不一定需要资源库版本控制机制。
上面的链接似乎建议您需要指定 Expires 或 Cache-Control。为什么这是必要的?
标Expires
头告诉浏览器何时通过条件 GET 请求重新测试缓存资源的有效性。所以,在那之前浏览器不会这样做,并且会继续使用缓存中的那个。Cache-Control
告诉浏览器使用哪种缓存策略。请注意,当它设置为 egno-cache
而不是 时public
,Expires
标题将不起作用。另请注意,没有Cache-Control
标头意味着public
(正如 JSF 资源所做的那样)。