JR 精品文章 - web開發(fā)中的緩存問題的研究(三)
web開發(fā)中的緩存問題的研究(三) | wty_703 轉貼 更新:2007-08-09 08:02:49 版本: 1.0 | |
(5)回到瀏覽器窗口中,簡要記住一下瀏覽器窗口和Tomcat的命令行窗口中顯示出的時間值,然后反復單擊瀏覽器工具欄中的“后退”和“前進”按鈕,可以看到每次顯示出的CacheServlet頁面內容都沒有變化,Tomcat的命令行窗口中也沒有打印出新的信息。直接在瀏覽器地址欄中輸入CacheServlet的訪問地址,結果也是如此。這說明用瀏覽器的“后退”或“前進”方式訪問已緩存的頁面時,或者直接在瀏覽器地址欄中訪問已緩存的頁面時,瀏覽器將直接調用緩存的內容,而不向服務器發(fā)出新的訪問請求。 在圖4.18所示的Windows資源管理器窗口中刪除CacheServlet頁面的緩存文件,再次使用“后退”和“前進”按鈕訪問CacheServlet,或者直接在瀏覽器地址欄中輸入CacheServlet的訪問地址,這時候瀏覽器窗口和Tomcat的命令行窗口中都將顯示出新的時間值。這說明,在緩存文件不再存在的情況下,使用“后退”和“前進”按鈕訪問CacheServlet時,或者直接在瀏覽器地址欄中輸入CacheServlet的訪問地址,瀏覽器將向服務器發(fā)出新的訪問請求。 通過瀏覽器工具欄中的“后退”或“前進”按鈕回到CacheTest.html頁面,然后單擊其中的超鏈接來訪問CacheServlet,這時可以看到瀏覽器窗口和Tomcat的命令行窗口中顯示出了新的時間值。重復這個過程,可以看到CacheServlet頁面每次都能顯示出新的時間值,這說明通過其他網(wǎng)頁文檔中的超鏈接來調用CacheServlet時,瀏覽器將向服務器發(fā)出新的訪問請求,而不是調用已緩存的內容。 (6)修改CacheServlet.java源文件,取消對getLastModified方法的注釋,重新編譯CacheServlet.java源文件,等待Tomcat重新裝載CacheServlet后,在瀏覽器窗口中刷新對CacheServlet的訪問。打開Internet臨時文件夾(如果該文件夾原來已經打開,則按F5鍵刷新一下),選中其中的CacheServlet緩存文件,從Windows資源管理器窗口中顯示出的摘要信息中可以看到,這次的CacheServlet緩存文件中有了一個上次修改時間的記錄信息,如圖4.20所示。
圖4.20
(7)重復第(4)步的操作,這時候的telnet窗口中顯示出的結果如圖4.21所示。
圖4.21
從圖4.21中可以看到,CacheServlet這次返回的響應消息中多了一個Last-Modified頭字段,這正是圖4.20中顯示的CacheServlet緩存文件有了一個上次修改時間的記錄信息的原因。 (8)回到瀏覽器窗口中,簡要記住一下瀏覽器窗口和Tomcat的命令行窗口中顯示出的時間值,然后反復單擊瀏覽器工具欄中的“后退”和“前進”按鈕,可以看到每次顯示出的CacheServlet頁面內容都沒有變化,Tomcat的命令行窗口中也沒有打印出新的信息。直接在瀏覽器地址欄中輸入CacheServlet的訪問地址,結果也是如此。這種情況與在步驟(5)中看到的實驗效果完全一樣。 通過瀏覽器工具欄中的“后退”或“前進”按鈕回到CacheTest.html頁面,單擊其中的超鏈接來訪問CacheServlet,這時看到瀏覽器窗口和Tomcat的命令行窗口中顯示出的內容仍然沒有變化,多次重復這個過程,看到的結果還是沒有變化。這種情況與步驟(5)中的看到的實驗效果截然不同,通過兩者的實驗效果的對比,我們可以得出如下結論:
如果某個頁面的響應消息中包含有Last-Modified頭字段,當通過其他網(wǎng)頁文檔中的超鏈接來調用這個頁面時,瀏覽器只在每次啟動后的第一次訪問這個頁面時才向服務器發(fā)出訪問請求,對于在這次啟動運行期間對該頁面的后續(xù)訪問,瀏覽器將不再向服務器發(fā)出訪問請求,而是直接調用緩存的內容。在訪問一個普通的HTML文件時,Tomcat的缺省Servlet都會產生一個Last-Modified頭字段來說明這個HTML文件的最新修改時間,因此,在瀏覽器的一次啟動運行期間,它只在對某個HTML文件進行第一次訪問時才向服務器發(fā)出真正的訪問請求。對HTML文件的頁面來說,它的內容正好在某個瀏覽器的某次運行期間的對該頁面的第一次和后續(xù)訪問之間發(fā)生改變的概率很小,并且即使發(fā)生這種情況,也不會出現(xiàn)什么大的問題,所以,Tomcat的缺省Servlet的這種處理方式完全是合理的和應該的。 如果某個頁面的響應消息中沒有包含Last-Modified頭字段,當通過其他網(wǎng)頁文檔中的超鏈接來調用這個頁面時,瀏覽器在整個啟動運行期間對該頁面的每次訪問,都將向服務器發(fā)出訪問請求,而不會調用已緩存的內容。因此,只要動態(tài)網(wǎng)頁程序中沒有產生Last-Modified頭字段,就不用擔心通過超鏈接再次訪問該動態(tài)網(wǎng)頁程序時會出現(xiàn)瀏覽器不向服務器發(fā)生訪問請求的問題。 在瀏覽器窗口中刷新對CacheServlet的訪問,刷新的作用就是讓瀏覽器務必向服務器發(fā)出訪問請求,這時候瀏覽器窗口中顯示出了新的內容。查看啟動Tomcat的命令行窗口,可以看到其中打印出類似如下的兩行新信息: getLastModified:1147408274473 doGet:1147408274473 這說明CacheServlet調用了getLastModified方法后,接著又調用了doGet方法。因為getLastModified方法返回的是當前時間,它肯定比瀏覽器發(fā)出的請求消息中的If-Modified-Since請求頭字段指定的時間值(即getLastModified方法上次被調用時返回的“當前時間”)要新,所以,CacheServlet調用完getLastModified方法后,接著又調用了doGet方法,于是在瀏覽器中就看到了新的內容。 (9)修改CacheServlet.java源文件,讓getLastModified方法中的最后那條return語句返回一個固定的時間值,如下所示: protected long getLastModified(HttpServletRequest req) { long now = System.currentTimeMillis(); System.out.println("getLastModified:" + now); return /*now*/1234; } 重新編譯CacheServlet.java源文件,等待Tomcat重新裝載CacheServlet后,新啟動一個瀏覽器程序訪問CacheTest.html頁面,然后單擊CacheTest.html頁面中的“緩存測試”超鏈接訪問CacheServlet,這時顯示出來的CacheServlet頁面的內容還是在步驟(8)中的最后看到的內容,沒有發(fā)生改變!查看啟動Tomcat的命令行窗口,可以看到其中僅打印出了一行類似如下的新信息: getLastModified:1147414361586 這個現(xiàn)象說明,瀏覽器剛才確實向服務器發(fā)出了訪問請求。由于瀏覽器發(fā)出的請求消息中帶有一個If-Modified-Since請求頭字段,其設置值為上次的Last-Modified頭字段指定的時間,而CacheServlet中的getLastModified方法這次返回的時間值比Last-Modified頭字段指定的時間值更舊(在一般情況下應該是相等,這里為了簡化程序的編寫,僅僅是返回1234這個比較陳舊的時間值,但不影響實驗效果),所以,CacheServlet沒有調用doGet方法(Tomcat的命令行窗口中沒有打印出doGet方法被調用的提示信息),而是向瀏覽器返回一個304(Not Modified)狀態(tài)碼來表示瀏覽器緩存的版本是最新的,從而導致瀏覽器仍舊顯示出了上次緩存的內容。 在瀏覽器窗口中刷新對CacheServlet的訪問,這時瀏覽器中顯示的內容依然如故,查看啟動Tomcat的命令行窗口,可以看到其中又只是打印出了一行getLastModified方法被調用的提示信息??梢?,如果瀏覽器緩存的某個頁面的響應消息中包含有Last-Modified頭字段,當瀏覽器再次向服務器發(fā)出針對該頁面的訪問請求時,只要處理這個頁面的Servlet程序的getLastModified方法返回的時間值比上次的Last-Modified頭字段的時間值舊或者與之相同時,服務器就不會返回新的內容。 (10)重復第(7)步的telnet訪問操作,等待服務器返回響應結果后,接著輸入如下內容: GET /it315/servlet/CacheServlet HTTP/1.1<回車> Host:<空格><回車> If-Modified-Since:<空格>Thu, 01 Jan 1970 00:00:01 GMT <回車> 其中的If-Modified-Since頭字段中的值是從剛才返回的Last-Modified頭字段中進行復制得到的,這時候可以看到服務器只返回了一個304(Not Modified)狀態(tài)碼,而沒有返回任何實體內容。接著輸入如下內容: GET /it315/servlet/CacheServlet HTTP/1.1<回車> Host:<空格><回車> If-Modified-Since:<空格>Thu, 01 Jan 1970 00:00:00 GMT <回車> 注意,其中的If-Modified-Since頭字段中的值比上一次的值小了1秒,這時候可以看到服務器返回了200狀態(tài)碼和新的實體內容,如圖4.22所示。
圖4.22
| |
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請
點擊舉報。