1. 程式人生 > >使用Filter過濾器禁止瀏覽器快取頁面

使用Filter過濾器禁止瀏覽器快取頁面

1.概述

     IE快取雖然能提高已儲存網站的訪問速度,但是過度的IE快取會影響瀏覽器的響應速度。同時還可能為網站的執行帶來一些不必要的麻煩。例如:可能會因為瀏覽器快取的應用,而導致Web伺服器不能準確的計算一個頁面或廣告已被閱覽的次數;在論壇或者網上商城系統中由於瀏覽器快取的使用,導致更新的圖片資訊不能得到及時的顯示;還有由於瀏覽器快取的使用,而使網頁設計者不能立即檢視到網頁更新後的效果。

    所以在開發網站的過程中,最好是在程式中禁止瀏覽器快取頁面,從而避免上述問題的出現,也省去了手動清空瀏覽器快取的麻煩。

    本例項中應用過濾器在網站的執行過程中禁止瀏覽器快取頁面。當執行本例項時,註冊明日購物網的使用者,註冊成功後。選擇IE瀏覽器,單擊滑鼠右鍵選擇“屬性”命令,彈出Internet屬性對話方塊,選擇常規選項卡,在Internet臨時檔案中單擊“設定”按鈕,在彈出的設定對話方塊中單擊“檢視檔案”按鈕,將看到瀏覽器快取中儲存的檔案,而此時該資料夾下沒有任何檔案。

2.技術要點

     瀏覽器快取(Browser Caching)是為了加速瀏覽,瀏覽器在使用者磁碟上對最近請求過的文件進行儲存,當訪問者再次請求這個頁面時,瀏覽器就可以從本地磁碟顯示文件,這樣就可以加速頁面的閱覽。

     本例項主要應用過濾器可以重新設定請求報頭資訊的特點,在過濾器中設定HTML中meta標籤的http-equiv屬性,實現禁止瀏覽器快取的功能。

     meta是HTML語言head區的一個輔助性標籤。meta標籤有兩個屬性:http-equiv屬性和name屬性。

     (1)name屬性

         用於描述網頁,與之對應的屬性值為content。content中的內容主要是用於搜尋引擎機器人查詢資訊和分類資訊。語法如下:

<meta name="引數" content="具體的引數值"> 

        name屬性的引數如表1所示。

表1 name屬性的引數說明

引數

說明

舉例

keywords

描述網頁的關鍵字

<meta name ="keywords" content="明日科技,明日軟體,明日圖書">

description

描述網站的主要內容

<meta name="description" content="軟體開發,圖書編著">

robots

告訴搜尋機器人哪些頁面需要索引,哪些頁面不需要索引。content的引數有all,none,index,noindex,follow,nofollow。預設是all

<meta name="robots" content="none">

author

標註網頁的作者

<meta name="author" content="吉林省明日軟體公司科技有限公司">

(2)http-equiv屬性

http-equiv相當於http的檔案頭作用,可以向瀏覽器傳回一些有用資訊,以幫助正確和精確地顯示網頁內容,與之對應的屬性值為content。content中的內容是各個引數的變數值。語法如下:

<meta http-equiv="引數" content="引數變數值">

<meta http-equiv="引數" content="引數變數值">

表2 http-equiv屬性的引數說明

引數

說明

舉例

expires

設定網頁的到期時間,一旦網頁過期,必須到伺服器上重新傳輸

<meta http-equiv="expires" content="Fri, 10 Jan 2009 09:09:09 GMT">

注意:必須使用GMT的時間格式

Pragma

禁止瀏覽器從本地計算機的快取中訪問頁面內容

<meta http-equiv="Pragma" content="no-cache">

Refresh

自動重新整理並指向新頁面

<meta http-equiv="Refresh" content="5;URL=http://www.mingribook.com">

Set-Cookie

如果網頁過期,那麼儲存的cookie將被刪除

<meta http-equiv="Set-Cookie" content="cookievalue=xxx;expires= Fri, 10 Jan 2009 09:09:09 GMT;path=/">

Window-target

強制頁面在當前視窗以獨立頁面顯示

<meta http-equiv="Window-target" content="_top">

用來防止在框架裡呼叫自己的頁面。

content-Type

設定頁面使用的字符集。

<meta http-equiv="content-Type" content="text/html; charset=UTF-8">

     上述是對meta標籤的詳細講解,在本例項中主要應用的是http-equiv屬性中的expires和Pragma引數,控制網頁的過期時間和禁止瀏覽器從本地計算機的快取中訪問頁面內容。

     而真正控制網頁快取的是HTTP訊息頭中的Cache-control。其常見值有private、no-cache、max-age和must-revalidate等,預設值為private。

Cache-control的作用根據瀏覽方法的不同可以分為以下幾種情況。

(1)以開啟新視窗的方式進行瀏覽

     如果指定cache-control的值為private、no-cache或者must-revalidate,那麼開啟新視窗訪問時都會重新訪問伺服器;如果指定的值為max-age,那麼在此值規定的時間裡就不會重新訪問伺服器,例如:Cache-control: max-age=10。表示當訪問此網頁後的10秒內再次訪問不會去伺服器。

(2)在位址列中單擊回車進行瀏覽

     如果值為private或must-revalidate,則只有第一次訪問時會訪問伺服器,以後就不再訪問;如果值為no-cache,那麼每次都會訪問;如果值為max-age,則在過期之前不會重複訪問。

(3)按後退按扭進行瀏覽

    如果值為private、must-revalidate、max-age,則不會重複訪問;如果值為no-cache,則每次都重複訪問。

(4)按重新整理按扭

    無論為何值,都會重複訪問。如果指定Cache-control值為“no-cache”時,訪問此頁面不會在Internet臨時資料夾中留下頁面備份。

3.具體實現

(1)首先建立index.jsp檔案,生成明日購物網的使用者註冊頁面。Form表單中的元素如表3所示。

表3 form表單中使用的元素

型別

名稱

屬性設定

說明

form_reg

method="post" action="index_ok.jsp" onSubmit="return chkreginfo(form_reg,'all')

表單名稱

recuser

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,0)"

使用者名稱

address

type="text" size="60" class="inputcss" onBlur="chkreginfo(form_reg,1)"

聯絡地址

postalcode

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,2)"

郵政編碼

qq

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,3)"

QQ號碼

email

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,4)"

郵箱地址

mtel

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,5)"

手機號碼

gtel

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,6)"

座機號碼

imageField

type="image" src="images/sy_15.jpg"

提交按鈕

ImageField2

onClick="form_reg.reset()"style="cursor:hand"

取消按鈕

(2)建立index_ok.jsp檔案,輸出從Request物件中獲取的提交資料。

(3)建立BrowserNoCacheFilter類,通過過濾器禁止瀏覽器快取頁面。在doFilter()方法中為meta標籤的http-equiv屬性設定三個引數:Cache-Control、Pragma和Expires,禁止瀏覽器快取頁面。其關鍵程式碼如下:

public class BrowserNoCacheFilter implements Filter {
    public void init(FilterConfig filterconfig) throws ServletException {
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterchain) throws IOException, ServletException {
        ((HttpServletResponse) response).setHeader("Cache-Control", "no-cache");      //HTTP訊息頭,控制網頁的快取
        ((HttpServletResponse) response).setHeader("Pragma", "no-cache");        //禁止瀏覽器從快取中調閱頁面內容
        ((HttpServletResponse) response).setHeader("Expires", "-1");                   //指定網頁在快取中的過期時間
        filterchain.doFilter(request, response);
    }
    public void destroy() {
    }
}

(4)最後在web.xml檔案中配置BrowserNoCacheFilter類,為過濾器建立初始值。首先通過<filter></filter>標籤配置Servlet過濾器的名稱和所在包的類名,然後通過<init-param></ init-param>標籤設定過濾器的初始值,最後通過<filter-mapping></filter-mapping>標籤配置Servlet過濾器的對映路徑。其關鍵程式碼如下:

<filter>
      <!—servlet過濾器的名稱 -->
         <filter-name>BrowserNoCacheFilter</filter-name>
   <!—servlet過濾器的包所在類名稱-->
      <filter-class>com.pkh.BrowserNoCacheFilter</filter-class>
       <init-param>
            <param-name>Cache-control</param-name>
            <param-value>no-cache</param-value>
        </init-param>
        <init-param>
            <param-name>Pragma</param-name>
            <param-value>no-cache</param-value>
        </init-param>
        <init-param>
            <param-name>Expires</param-name>
            <param-value>-1</param-value>
        </init-param>
</filter>
     <filter-mapping>
            <!--要對映的servlet過濾器名稱-->
           <filter-name>BrowserNoCacheFilter </filter-name>
            <!--要對映的servlet過濾器對映的範圍--> 
            <url-pattern>/ *</url-pattern>
           <dispatcher>REQUEST</dispatcher>
           <dispatcher>FORWARD</dispatcher>
    </filter-mapping>