Servlet過濾器——使用過濾器禁止瀏覽器緩存頁面

1.概述

     IE緩存雖然能提升已儲存網站的訪問速度,可是過分的IE緩存會影響瀏覽器的響應速度。同時還可能爲網站的運行帶來一些沒必要要的麻煩。例如:可能會由於瀏覽器緩存的應用,而致使Web服務器不能準確的計算一個頁面或廣告已被閱覽的次數;在論壇或者網上商城系統中因爲瀏覽器緩存的使用,致使更新的圖片信息不能獲得及時的顯示;還有因爲瀏覽器緩存的使用,而使網頁設計者不能當即查看到網頁更新後的效果。css

    因此在開發網站的過程當中,最好是在程序中禁止瀏覽器緩存頁面,從而避免上述問題的出現,也省去了手動清空瀏覽器緩存的麻煩。html

    本實例中應用過濾器在網站的運行過程當中禁止瀏覽器緩存頁面。當運行本實例時,註冊明日購物網的用戶,註冊成功後。選擇IE瀏覽器,單擊鼠標右鍵選擇「屬性」命令,彈出Internet屬性對話框,選擇常規選項卡,在Internet臨時文件中單擊「設置」按鈕,在彈出的設置對話框中單擊「查看文件」按鈕,將看到瀏覽器緩存中存儲的文件,而此時該文件夾下沒有任何文件。web

 

2.技術要點

     瀏覽器緩存(Browser Caching)是爲了加速瀏覽,瀏覽器在用戶磁盤上對最近請求過的文檔進行存儲,當訪問者再次請求這個頁面時,瀏覽器就能夠從本地磁盤顯示文檔,這樣就能夠加速頁面的閱覽。瀏覽器

     本實例主要應用過濾器能夠從新設置請求報頭信息的特色,在過濾器中設置HTML中meta標籤的http-equiv屬性,實現禁止瀏覽器緩存的功能。緩存

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

     (1)name屬性cookie

         用於描述網頁,與之對應的屬性值爲content。content中的內容主要是用於搜索引擎機器人查找信息和分類信息。語法以下:app

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

        name屬性的參數如表1所示。框架

表1 name屬性的參數說明jsp

參數

說明

舉例

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>
相關文章
相關標籤/搜索