1. 程式人生 > >Tomcat環境下設定HTTP強快取

Tomcat環境下設定HTTP強快取

  在之前的一篇文章《HTTP快取詳解》中詳細的整理了關於HTTP快取的知識點,這一篇通過實踐,具體驗證如何設定HTTP的強快取,讓客戶端直接從本地快取中拿資源,而不發起網路請求。

一、設定HTTP強快取

  可通過ExpiresCache-Control控制資源何時過期。Expires通過設定一個具體過期日期來控制,Cache-Control是設定一個距離第一次請求之後多久的時間段來控制。

1.自定義Filter

過濾器程式碼如下:

public class FilterCache implements Filter {
    @Override
    public
void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; //res.setDateHeader("expries", new Date().getTime()+60*60*24*1000); //- 設定一天失效,經測試Chrome下不生效
res.setHeader("Cache-Control", "max-age=10"); //- 這裡的單位為秒,10代表第一次請求10s後過期 } @Override public void destroy() { // TODO Auto-generated method stub } }

web.xml配置如下:

<!-- 過濾所有的js檔案 -->
<filter>
    <filter-name>FilterCache</filter-name
>
<filter-class>com.demo.cache.FilterCache</filter-class> </filter> <filter-mapping> <filter-name>FilterCache</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping>

2.使用容器的Filter

  tomcat容器提供自有的過濾器來設定HTTP快取,只需在web.xml中進行配置即可,相信其它伺服器也有相關的配置項,例如Nginx、WebLogic等。

配置如下:

<filter>
 <filter-name>ExpiresFilter</filter-name>
 <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
 <init-param>
    <param-name>ExpiresByType image</param-name>
    <param-value>access plus 10 days</param-value>
 </init-param>
 <init-param>
    <param-name>ExpiresByType text/css</param-name>
    <param-value>access plus 10 days</param-value>
 </init-param>
 <init-param>
    <param-name>ExpiresByType application/javascript</param-name>
    <param-value>access plus 10 days</param-value>
 </init-param>
</filter>

<filter-mapping>
 <filter-name>ExpiresFilter</filter-name>
 <url-pattern>/*</url-pattern>
 <dispatcher>REQUEST</dispatcher>
</filter-mapping>

官方文件:

二、特別說明

1.客戶端環境準備

在Chrome下,需進行如下設定(F12接著按F1即可開啟settings面板):

{% asset_img DisableCache.jpg  %}

2.重新整理瀏覽器方式

  經過測試,只有通過瀏覽器位址列回車的方式強快取才會生效;以F5、瀏覽器重新整理按鈕、Ctrl+R方式重新整理頁面均會發起HTTP網路請求,即使快取未過期。

三、結果

在Chrome下測試結果如下:

{% asset_img chrome.jpg  %}

  設定Cache-Control的過期時間為10s,第一次請求返回200,在size欄下顯示檔案大小;第二次重新整理頁面,size欄顯示from memory cache,即證明瀏覽器未發起網路請求,直接從本地快取中獲取資源。在IE下會顯示來自快取,Firefox下顯示已快取

  經測試,使用Cache-Control設定快取在Chrome、Firefox、Edge、IE11下均有效,使用Expires只在IE11與Edge下生效。