在介紹HTML5 web緩存前,來認識一下cookie和session:
session:
由於HTTP是無狀態的,你是誰?你干了什么?抱歉服務器都是不知道的。
因此session(會話)出現了,它會在服務器上存儲用戶信息以便將來使用(比如用戶名稱,購物車購買商品等)。
但是session是臨時的,用戶離開網站將被刪除。如果要永久存儲信息,可以保存在數據庫中!
session工作原理:為每個用戶創建一個session id(核心!!!)。而session id是存儲在cookie中的,也就是說如果瀏覽器禁用了cookie,那么session會失效!(但是可以通過其它方式實現,如:通過URL傳遞session id)
用戶驗證一般采用session。
cookie:
目的:網站標記用戶身份而存儲在本地客戶端的數據(通常經過加密)。
- 用戶訪問網頁時,名字記錄在cookie中;
- 下次繼續訪問該網頁時,可以從cookie中讀取用戶訪問記錄。
cookie會在同源的http請求攜帶(即使不需要),即在客戶端和服務器之間來回傳遞!
cookie的數據大小不超過4k
cookie的有效期:設置的cookie有效時間之前一直有效,即使瀏覽器關閉!
localStorage & sessionStorage:
早期,本地緩存普遍使用的是cookie,但是web存儲需要更安全、更快速!
這些數據不會保存在服務器上(存儲在客戶端),不會影響服務器性能!
sessionStorage和localStorage數據存儲也有大小限制,但卻比cookie大得多,可以達到5M甚至更大!
localStorage:沒有時間限制的數據存儲!
sessionStorage:由英文意思也可知,它是對session的數據存儲,所以在用戶關閉瀏覽器(標簽頁/窗口)后,數據被刪除!
HTML5 web存儲支持情況:
IE8以上,現代瀏覽器。
數據以鍵值對存儲:
localStorage和sessionStorage都有以下幾個方法:
- localStorage.setItem(key,value):設置(保存)數據;相當於localStorage.key=value!
- localStorage.getItem(key):獲取數據
- localStorage.removeItem(key):刪除單個數據
- localStorage.clear():刪除所有數據
- localStorage.key(index):獲取某個索引的鍵值
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>web storage</title> 9 </head> 10 11 <body> 12 <div id="test"></div> 13 <script> 14 if (typeof (Storage) != undefined) { 15 localStorage.name = 'xiao ming'; 16 localStorage.setItem('name1', 'Apple'); 17 document.getElementById('test').innerHTML = "you are: " + localStorage.name; 18 console.log("first:" + localStorage.name1 + "," + localStorage.key(0)); 19 localStorage.removeItem('name1'); 20 console.log("second: " + localStorage.name1); 21 console.log("third: " + localStorage.getItem('name')); 22 localStorage.clear(); 23 console.log("last:" + localStorage.name); 24 } else { 25 document.getElementById('test').innerHTML = "更新瀏覽器吧!目前瀏覽器不支持stroage"; 26 } 27 28 </script> 29 </body> 30 31 </html>
程序運行結果:
注意:鍵值對是以字符串保存的,根據需求應改變類型(比如做加法,變為Number型)。
HTML5運用程序緩存(Application Cache):
通過創建cache manifest文件,web運用可被緩存,並且無網絡狀態可以進行訪問!
Application Cache優勢:
- 離線瀏覽;
- 速度更快:已緩存資源加載更快;
- 減少瀏覽器負載:客戶端將只從服務器下載或更新更改過的資源
支持情況:
IE10以上,現代瀏覽器。
使用:
1 <!DOCTYPE html> 2 <html manifest="demo.appcache"> 3 4 </html>
注意:要開啟application cache,需指定manifest屬性(擴展名:.appcache);如果未指定manifest屬性,頁面不會緩存(除非在manifest文件中直接指定了該頁面!)
manifest文件在服務器上需正確的配置MIME-type:text/cache-manifest。
Manifest文件:
manifest是簡單的文本文件,它告知瀏覽器被緩存的內容以及不被緩存的內容!
manifest可分為三部分:
CACHE MANIFEST:此項列出的文件將在首次下載后進行緩存!
NETWORK:此項列出的文件需要與服務器進行網絡連接,不會被緩存!
FALLBACK:此項列出當頁面無法訪問時的回退頁面(如:404頁面)!
test.appcache:
1 CACHE MANIFEST 2 #2017 11 21 v10.0.1 3 /test.css 4 /logo.gif 5 /main.js 6 7 NETWORK 8 /login.php 9 /register.php 10 11 FALLBACK 12 #/html/目錄中文件無法訪問時,用/offline.html替代 13 /html/ /offline.html
更新application cache的情況:
- 用戶清空瀏覽器緩存!
- manifest文件被更改(#:表示注釋,同時如果更改為#2018 1 1 v20.0.0,則瀏覽器會重新緩存!)
- 程序進行更新application cache!
Web Workers:
web workers是運行在后台的javascript,獨立於其它腳本,不會影響頁面性能!
而一般的HTML頁面上執行腳本時,除非腳本加載完成,否則頁面不會響應!
支持情況:IE10以上,現代瀏覽器
示例:html文件:

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>web worker</title> 8 </head> 9 <body> 10 <p>計數:<output id="count"></output></p> 11 <button onclick="startWorker()">開始</button> 12 <button onclick="overWorker()">結束</button> 13 14 <script> 15 var w; 16 function startWorker(){ 17 // 檢測瀏覽器是否支持web worker 18 if(typeof(Worker)!=='undefined'){ 19 if(typeof(w)=='undefined'){ 20 //創建web worker對象 21 w=new Worker('testWorker.js'); 22 } 23 // 事件持續監聽(即使外部腳本已經完成),除非被終止 24 w.onmessage=function(event){ 25 document.getElementById('count').innerHTML=event.data; 26 }; 27 }else{ 28 document.getElementById('count').innerHTML='瀏覽器不支持web worker'; 29 } 30 } 31 function overWorker() { 32 // 終止web worker對象,釋放瀏覽器/計算機資源 33 w.terminate(); 34 w=undefined; 35 } 36 </script> 37 </body> 38 </html>
testWorker.js文件:
1 var i=0; 2 function timedCount() { 3 i+=1; 4 // 重要的部分,向html頁面傳回一段信息 5 postMessage(i); 6 setTimeout('timedCount()',500); 7 } 8 timedCount();
注意1:通常web worker不是用於如此簡單的任務,而是用在更耗CPU資源的任務!
注意2:在chrome中運行會產生“cannot be accessed from origin 'null'”的錯誤,我的解決方法是:xampp中開啟apache,用http://localhost/進行訪問。
web worker缺點:
由於web worker位於外部文件中,所以它無法訪問下列javascript對象:
- window對象;
- document對象;
- parent對象。
HTML5 server-sent events(服務器發送事件):
server-sent事件是單向信息傳遞;網頁可以自動獲取來自服務器的更新!
以前:網頁先詢問是否有可用的更新,服務器發送數據,進行更新(雙向數據傳遞)!
支持情況:除IE以外的現代瀏覽器均支持!
示例代碼:html文件:

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>sever sent event</title> 8 </head> 9 <body> 10 <p>sever sent event informations</p> 11 <div id="test"></div> 12 <script> 13 // 判斷瀏覽器是否支持EventSource 14 if(typeof(EventSource)!==undefined){ 15 // 創建EventSource對象 16 var source=new EventSource("test.php"); 17 // 事件監聽 18 source.onmessage=function(event){ 19 document.getElementById('test').innerHTML+=event.data+"<br>"; 20 }; 21 }else{ 22 document.getElementById('test').innerHTML="sorry,瀏覽器不支持server sent event"; 23 } 24 </script> 25 </body> 26 </html>
test.php:
1 <?php 2 header('Content-Type:text/event-stream'); 3 header('Cache-Control:no-cache'); 4 5 $time=date('r'); 6 echo "data:The server time is: {$time} \n\n"; 7 // 刷新輸出數據 8 flush();
注意:后面沒有內容,php文件可以不用"?>"關閉!
HTML5 WebSocket:
- WebSocket是HTML5提供的一種在單個TCP連接上建立全雙工(類似電話)通訊的協議;
- 瀏覽器和服務器之間只需要進行一次握手的操作,瀏覽器和服務器之間就形成了一條快速通道,兩者之間就可直接進行數據傳送;
- 瀏覽器通過javascript建立WebSocket連接請求,通過send()向服務器發送數據,onmessage()接收服務器返回的數據。
實例可參考:點擊這里進行跳轉!
WebSocket如何兼容低瀏覽器:
- Adobe Flash Socket;
- ActiveX HTMLFile(IE);
- 基於multipart編碼發送XHR;
- 基於長輪詢的XHR
WebSocket可以用在多個標簽頁之間的通信!