小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

JR 精品文章 - web開發(fā)中的緩存問題的研究(二)

 Long_way 2007-08-24
web開發(fā)中的緩存問題的研究(二)
wty_703 轉(zhuǎn)貼   更新:2007-08-09 08:02:25  版本: 1.0   

 從圖4.16中還可以看到,其“檢查所存網(wǎng)頁的較新版本”功能項的設(shè)置值有4個選項,只要先單擊“設(shè)置”對話框標題欄中的問號按鈕,然后再單擊相應(yīng)的選項,就可以看到每個選項的作用和意義:

“每次訪問此頁時檢查”選項表示瀏覽器每次訪問一個頁面時,不管瀏覽器是否緩存過此頁面,都要向服務(wù)器發(fā)出訪問請求。這種設(shè)置的優(yōu)點是實時性很強,肯定能夠訪問到網(wǎng)頁的最新內(nèi)容,但是如果網(wǎng)頁內(nèi)容很少更新,這種設(shè)置的訪問效率就比較低了。 
“每次啟動Internet Explorer時檢查”選項表示在瀏覽器的每次啟動運行期間,在第一次訪問一個頁面時,不管瀏覽器是否緩存過此頁面,都要向服務(wù)器發(fā)出訪問請求,但是在瀏覽器的本次啟動運行期間對該頁面的后續(xù)訪問,瀏覽器將不再向服務(wù)器發(fā)出訪問請求,而是直接使用緩存中的內(nèi)容。這種設(shè)置具有較高的訪問效率,同時也兼顧了較好的實時性,它可以保證每次啟動瀏覽器后看到的都是最新的網(wǎng)頁內(nèi)容。 
“自動”選項與“每次啟動Internet Explorer時檢查”選項的功能相似,只是對圖像的訪問有所不同,如果隨著時間的推移,瀏覽器發(fā)現(xiàn)網(wǎng)頁上的圖像更新并不頻繁,這樣,即使瀏覽器在對某個已緩存的圖像執(zhí)行本次啟動運行以來的第一次訪問時,它也不一定會向服務(wù)器發(fā)出訪問請求,而是干脆直接使用緩存中的內(nèi)容。“自動”選項是瀏覽器的默認設(shè)置,所以,幾乎所有人的瀏覽器都是按照這種方式工作的,這個選項的作用和意義應(yīng)該成為讀者熟悉的重點。 
“不檢查”選項表示瀏覽器不管在什么情況下訪問一個頁面時,只要能夠在本地找到此頁面的緩存信息,瀏覽器就不會向服務(wù)器發(fā)出訪問請求,而是直接使用緩存的內(nèi)容。這種設(shè)置的優(yōu)點是訪問效率很高,但是如果服務(wù)器端的網(wǎng)頁內(nèi)容更新后,瀏覽器看到的內(nèi)容很可能是過期的內(nèi)容。 
    在瀏覽器的“檢查所存網(wǎng)頁的較新版本”的功能項采用默認的“自動”設(shè)置項的情況下,如果瀏覽器剛剛訪問過一個網(wǎng)頁,服務(wù)器端就更新了這個網(wǎng)頁的內(nèi)容,當瀏覽在關(guān)閉前又重新訪問這個頁面時,用戶看到的將不是更新的網(wǎng)頁內(nèi)容,而是過期的網(wǎng)頁內(nèi)容。為了提高瀏覽效率,在訪問靜態(tài)的網(wǎng)頁內(nèi)容時,這么一點小概率的過期信息還是應(yīng)該允許的,并且這些過期信息也不會造成什么不好的后果,就像你偶爾有一次看到了前一天發(fā)生的新聞,而不是當天的新聞,這又有什么問題呢?可是,如果瀏覽器訪問的是一個動態(tài)網(wǎng)頁,這本來就要求瀏覽器在其整個運行期間的每次訪問都能看到最新的內(nèi)容,例如,銷售一件商品后再回到商品庫存的顯示頁面時,看到的就應(yīng)該是更新的庫存數(shù)據(jù),而不應(yīng)該是先前看到的內(nèi)容。僅僅根據(jù)被訪問頁面的資源名稱,瀏覽器是無法知道商品庫存的顯示頁面是屬于動態(tài)內(nèi)容,還是屬于靜態(tài)內(nèi)容。對于這種情況,瀏覽器將根據(jù)響應(yīng)消息中是否包含Last-Modified頭字段來進行處理,如果響應(yīng)消息中沒有包含Last-Modified頭字段,它將在每次訪問此頁面時都向服務(wù)器發(fā)出訪問請求,否則,它僅在每次啟動運行后的第一次訪問此頁面時才向服務(wù)器發(fā)出訪問請求,而在啟動運行期間對此頁面的后續(xù)訪問都不再向服務(wù)器發(fā)出訪問請求。
    在第2章中曾經(jīng)講解過,響應(yīng)消息中的Last-Modified頭字段可用于指定響應(yīng)內(nèi)容的最后更新時間,當客戶機緩存此文檔內(nèi)容后,它在以后的請求消息中將根據(jù)Last-Modified頭字段指定的時間來生成If-Modified-Since請求頭字段,以指出緩存文檔的最后更新時間。只有文檔的修改時間比If-Modified-Since請求頭指定的時間新時,服務(wù)器才會返回文檔內(nèi)容。如果自從If-Modified-Since指定的時間以來,網(wǎng)頁內(nèi)容沒有發(fā)生修改,服務(wù)器將返回一個304(Not Modified)狀態(tài)碼來表示瀏覽器緩存的版本是最新的,而不會向瀏覽器返回文檔內(nèi)容,瀏覽器則繼續(xù)使用以前緩存的內(nèi)容。通過這種方式,可以在一定程度上減少瀏覽器與服務(wù)器之間的通信數(shù)據(jù)量,從而提高了通信效率。
    HttpServlet類為If-Modified-Since請求頭和Last-Modified頭字段的這種應(yīng)用提供了處理機制,當繼承了HttpServlet類的Servlet程序接收到一個GET方式的訪問請求時,HttpServlet中重載的service方法在調(diào)用doGet方法之前,它還將調(diào)用getLastModified方法,并根據(jù)getLastModified方法的返回值來決定是否調(diào)用doGet方法和在響應(yīng)消息中是否生成Last-Modified頭字段,具體規(guī)則如下:

當getLastModified方法返回一個負數(shù)時,不管請求消息中的情況怎樣,service方法都將直接調(diào)用doGet方法來生成響應(yīng)內(nèi)容,這正是HTTPServlet類中定義的getLastModified方法的行為; 
當getLastModified方法返回一個正數(shù),且請求消息中沒有包含If-Modified-Since請求頭時(這往往出現(xiàn)在第對某個資源的第一次訪問時),或者請求消息中包含的If-Modified-Since請求頭中的時間值比getLastModified方法返回的時間值舊時,service方法將根據(jù)getLastModified方法的返回值生成一個Last-Modified頭字段,然后調(diào)用doGet方法生成響應(yīng)內(nèi)容; 
當getLastModified方法返回一個正數(shù)時,且請求消息中包含的If-Modified-Since請求頭中的時間值比getLastModified方法返回的時間值新或者與之相同時,service方法將不調(diào)用doGet方法,而是向瀏覽器返回一個304(Not Modified)狀態(tài)碼表示瀏覽器可以使用其以前緩存的內(nèi)容。 
動手體驗:揭開瀏覽器緩存的奧秘
(1)編寫一個名為CacheServlet的Servlet程序,在其doGet方法中向瀏覽器和Tomcat的命令行窗口中都打印出當前的時間值,getLastModified方法也是向Tomcat的命令行窗口中打印出當前的時間值和返回當前時間值,這里先將getLastModified方法注釋掉,如例程4-9所示。

例程4-9  CacheServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class CacheServlet extends HttpServlet
{
   public void doGet(HttpServletRequest request,
     HttpServletResponse response) throws ServletException, IOException
   {
      PrintWriter out = response.getWriter();
      long now = System.currentTimeMillis();
      out.println("doGet:" + now);
      System.out.println("doGet:" + now);
   }
 
    /*protected long getLastModified(HttpServletRequest req)
     {
        long now = System.currentTimeMillis();
        System.out.println("getLastModified:" + now);
        return now;
       }*/
}

編譯CacheServlet.java文件,確保編譯后生成的class文件放置進了d:\myweb\WEB-INF\classes目錄中。


(2)在d:\myweb目錄中編寫一個名稱為CacheTest.html的網(wǎng)頁文件,如例程4-10所示。

例程4-10  CacheTest.html

<a href="servlet/CacheServlet">緩存測試</a>

(3)為了便于查看瀏覽器如何生成緩存內(nèi)容,最好是先刪除掉Internet臨時文件夾中保存的所有緩存內(nèi)容。單擊IE瀏覽器的“工具”?“Internet選項”菜單,打開如圖4.16所示的“Internet選項”對話框,接著再單擊“常規(guī)”選項卡中的“Internet臨時文件”欄中的“刪除文件”按鈕,這就刪除了Internet臨時文件夾中保存的所有緩存內(nèi)容。單擊“常規(guī)”選項卡中的“Internet臨時文件”欄中的“設(shè)置”按鈕,在打開的“設(shè)置”對話框框中單擊“Internet臨時文件夾”欄中的“查看文件”按鈕,打開如圖4.17所示的Internet臨時文件夾,可以看到其中已經(jīng)不再有任何緩存的文件。另外,在“設(shè)置”對話框框中還需要將“檢查所存網(wǎng)頁的較新版本”的功能項恢復為默認的“自動”。
    在瀏覽器地址欄中輸入如下地址:
         http://localhost:8080/it315/CacheTest.html 
    在瀏覽器窗口中顯示的結(jié)果頁面中,單擊“緩存測試”超鏈接訪問CacheServlet。再次打開Internet臨時文件夾,這時可以看到其中生成了剛才訪問過的CacheTest.html和CacheServlet這兩個頁面的緩存文件,如圖4.18所示。選中其中的CacheServlet緩存文件,從Windows資源管理器窗口中顯示出的摘要信息中可以看到,CacheServlet緩存文件中記錄的上次修改時間為“無”。


圖4.18

(4)在命令行窗口中執(zhí)行telnet 127.0.0.1 8080命令,連接上Tomcat WEB服務(wù)器后,接著在telnet程序命令窗口中,輸入如下內(nèi)容:
                    GET /it315/servlet/CacheServlet HTTP/1.1<回車>
                     Host:<空格><回車>
                     <回車>
    telnet窗口中顯示出的結(jié)果如圖4.19所示。


 圖4.19

    從圖4.19中可以看到,CacheServlet返回的響應(yīng)消息中沒有Last-Modified頭字段,這正是圖4.18中顯示的CacheServlet緩存文件的上次修改時間為“無”的原因。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多