但有這樣一些頁面,雖然是動態的但變動頻率較小,且對於同一使用者重複呼叫可能很多(比如說個人管理後台或者新聞首頁面),我們希望像js或者ccs那樣在客戶端快取起來.並且,在我們希望的時候,可以更新客戶端備份的那個頁面,或者介面資料.是否可以做到呢;
事實上,瀏覽器可以快取js,就一定能快取我們的動態頁面;
先研究下js是如何快取起來的:
用firebug看一下js的載入:
先強刷(ctrl+f5)一下 [url] 頁面,**js的載入如圖
[img]
狀態為200 , 查一下200的含意 :
[i]請求成功(其後是對get和post請求的應答文件。)[/i]
這是對js檔案的完整載入;
再直接f5重新整理下 [url] ,**js的載入如圖
[img]
狀態為304,再查一下304的含意:
[i]未按預期修改文件。客戶端有緩衝的文件並發出了乙個條件性的請求(一般是提供if-modified-since頭表示客戶只想比指定日期更新的文件)。伺服器告訴客戶,原來緩衝的文件還可以繼續使用。[/i]
此時其實並沒有從服務端載入完整檔案而是去讀的本地快取;
從304的描述來看,我們知道,請求依然發出,並由服務端告知瀏覽器,掉用快取;
我們可以總結出兩點:
[b]1.
由於服務端只是返回簡單的頭資訊,並沒有生成完整頁面,所以雖然請求依然發出,對於瀏覽器和伺服器來說都更快更輕鬆了;[/b]
[b]2.
我們可以控制瀏覽器去更新快取;)[/b]
具此,我們可以得出結論,對於某此動態頁面來說,完全可以充分利用瀏覽器快取來降低伺服器壓力,提公升客戶端速度;
----------------------------------分隔線 ----------------------------------------
現在我們來看下要怎麼做;
由於對文件的描述在http頭資訊中,並且依據304的描述,我們知道,這個屬性和 modified time有關,我們比對下普通的頁面和js的頁面的respose的頭資訊的不同:
[img]
我們發現,多了個[b]last-modified[/b]的屬性;
再比對請求,
[img]
發現,多了[b]if-modified-since[/b];
武斷的推測一下(或者認真的讀下http協議的文件):我們可以這樣認為:
1.第一次請求成功返回202;
2.假如返回頭資訊有last-modified屬性 則存入瀏覽器快取;
3.再次請求,假如請求的為快取頁面,則頭資訊中加入 if-modified-since;
4.服務端通過if-modified-since(即上次響應中last-modified的值)來判斷是否需要更新,否的話返回304;
5.假如返回304,則瀏覽器則讀快取;
[img]
按照這個原理我們通過 httpservletresponse, httpservletrequest來償試實現下:
對任意乙個頁面先來句
getresponse().addheader("last-modified", "hello kitty");
然後再次請求該頁面時,我們就可以發現請求中就有了 if-modified-since 屬性
getrequest().getheader("if-modified-since");
通過這句**,拿到具體值;
假如判斷為不用更新則直接返回304
並且立即結束返回,不用繼續執行;
對於取到的if-modified-since,即是上次存入的last-modified,裡面的值到是可以很隨意,你除了放時間,也可以放memberid;
--------------------------------分隔線 ----------------------------------
實現問題也解決了;
最後乙個問題,是怎麼保證介面,或者頁面的動態性;也就是說怎麼通過last-modified或者if-modified-since來判斷頁面不需要更新;
考慮最簡單的情況,這個介面或者頁面僅提供和使用者相關的不同資訊,並且該資訊一但建立則不會改變;
那對於此介面,假如引數中包含memberid屬性,則一但具有if-modified-since值,則永遠返回304;因為對於不同url,瀏覽器均會進行快取;
假如memberid屬性在cookie中,url一致,那麼,在last-modified中存入memberid,判斷時於cookie或者session中url比對,相同則認為是正確的快取返回304;
現在,新的問題來了,使用者的相關資訊更新了;
假如這個更新頻率不是那麼頻繁,那麼想辦法做個更新機制還是合理的;你需要乙個地方在服務端記錄使用者介面資訊的版本號了,從if-modified-since中取得上次的版本號,然後進行比對,如果相同,則返回304;
在某些情況下,獲取更新記錄資訊要比計算合成完整資訊並利用頻寬將資料傳給客戶端代價小得多,此時你可以試下web服務動態介面的靜態快取;
客戶端快取
你的 在併發訪問很大並且無法承受壓力的情況下,你會選擇如何優化?很 多人首先會想從伺服器快取方面著手對程式進行優化,許多不同的伺服器快取方式都有他們自己的特點,像我曾經參與的一些專案中,根據快取的命中率不同使用過 com enterprise libiary caching windows服務,靜態...
php http 快取 客戶端快取
expires 過期時間 cache control 響應頭資訊 max age 秒 快取過期時間 請求時間開始到過期時間的秒數 s maxage 秒 快取過期時間 public 標記認證內容能被快取,一般而言輸出是不能被快取的,no cache 無快取,表示直接讀取資料源,no store 強制快...
客戶端定時自動列印頁面的例子
介紹客戶端自動列印功能的例子,客戶只要在電腦上開啟該頁面,就可以定時檢查列印任務,並觸發印表機自動列印,列印後可以將本次列印的資訊提交到資料的表中。該功能用到潤幹報表如下功能 1 直接列印函式 report1 directprint 2 列印後 頁面動作函式 runqian printover 類似...