這篇文章只是對我以爲經常使用的緩存方法的學習記錄。我是經過參考下面參考資料作的總結,你們能夠直接看參考連接裏的文章,他們的記錄更全面且帶圖。javascript
瀏覽器緩存分爲:強緩存和協商緩存。
強緩存和協商緩存並非平行關係,協商緩存是強緩存的基礎上加強的緩存功能。html
強緩存的過程:
第一次請求:瀏覽器第一次發送請求到服務器,服務器會把response header里加上Expires和Cache-Control:max-age=365000000,這兩個請求頭中的一個或兩個。
而後:瀏覽器收到響應後,會把這個response header以及響應的資源一塊兒緩存下來。html5
下一次請求時:瀏覽器根據這兩個請求頭的值計算當前時間這個緩存是否過時,若是不過時就直接響應緩存內容而不用向服務器發送請求獲取資源。java
(Expires,它的值是GMT格式的過時的絕對時間,例如是2019年的6月23日 12:00:00 過時,這樣等客戶端的時間過了這個時間,這個緩存就會過時。Cache-Control:max-age=365000000,這個請求頭的max-age的值是一個時間段,也就是說,它保存的是相對時間,每次請求時,瀏覽器會用客戶端時間減去第一次請求時的時間,大於這個相對時間段,則過時,須要從新請求資源)git
協商緩存的過程:
第一次請求:瀏覽器第一次發送請求到服務器,服務器除了會把response header里加上強緩存的配置項(Expires|Cache-Control),還會把協商緩存的配置項加入(Last-Modified|ETag)(Last-Modified是資源最後一次更新的時間。ETag這個header是服務器根據當前請求的資源生成的一個惟一標識,這個惟一標識是一個字符串,只要資源有變化這個串就不一樣,跟最後修改時間沒有關係)
而後:瀏覽器收到響應後,會把這個response header以及響應的資源一塊兒緩存下來。github
下一次請求時:瀏覽器會先判斷強緩存是否過時,若是沒過時,直接使用緩存資源,過時了則會向服務器發送請求資源,這時的request header裏瀏覽器會加上If-Modified-Since或If-None-Match (If-Modified-Since的值就是上一次請求時返回的Last-Modified的值。If-None-Match的值就是上一次請求時返回的ETag的值)
服務器再次收到資源請求時:ajax
If-Modified-Since: 服務器根據瀏覽器傳過來If-Modified-Since和資源在服務器上的最後修改時間判斷資源是否有變化,若是沒有變化則返回304 Not Modified,可是不會返回資源內容;若是有變化,就正常返回資源內容。當服務器返回304 Not Modified的響應時,response header中不會再添加Last-Modified的header,由於既然資源沒有變化,那麼Last-Modified也就不會改變。數據庫
If-None-Match: 服務器根據瀏覽器傳過來If-None-Match和而後再根據資源生成一個新的ETag,若是這兩個值相同就說明資源沒有變化,不然就是有變化;若是沒有變化則返回304 Not Modified,可是不會返回資源內容;若是有變化,就正常返回資源內容。與Last-Modified不同的是,當服務器返回304 Not Modified的響應時,因爲ETag從新生成過,response header中還會把這個ETag返回,即便這個ETag跟以前的沒有變化
瀏覽器收到304 Not Modified的響應:表示資源沒有變化,緩存資源還可使用。
下圖是流程圖:跨域
Cookie(或者Cookies),指通常網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(一般通過加密)。cookie通常經過http請求中在頭部一塊兒發送到服務器端。一條cookie記錄主要由鍵、值、域、過時時間、大小組成,通常用戶保存用戶的認證信息。
下面是cookies的經常使用接口:瀏覽器
var setCookie=function (c_name, value, expiredays, path){ var exdate=new Date(); exdate.setDate(exdate.getDate() + expiredays); document.cookie=c_name+ "=" + escape(value) + ((expiredays==null) ? "" : ";expires="+exdate.toGMTString()) + ((path==null) ? "" : ";path="+path); } var getCookie=function (c_name){ if (document.cookie.length>0){ //先查詢cookie是否爲空,爲空就return "" c_start=document.cookie.indexOf(c_name + "=") //經過String對象的indexOf()來檢查這個cookie是否存在,不存在就爲 -1 if (c_start!=-1){ c_start=c_start + c_name.length+1 //最後這個+1其實就是表示"="號啦,這樣就獲取到了cookie值的開始位置 c_end=document.cookie.indexOf(";",c_start) //其實我剛看見indexOf()第二個參數的時候猛然有點暈,後來想起來表示指定的開始索引的位置...這句是爲了獲得值的結束位置。由於須要考慮是不是最後一項,因此經過";"號是否存在來判斷 if (c_end==-1) c_end=document.cookie.length return unescape(document.cookie.substring(c_start,c_end)) //經過substring()獲得了值。想了解unescape()得先知道escape()是作什麼的,都是很重要的基礎,想了解的能夠搜索下,在文章結尾處也會進行講解cookie編碼細節 } } return "" }
下面是身份認證相關的:
Cookie Auth
Cookie認證機制就是爲一次請求認證在服務端建立一個Session對象,同時在客戶端的瀏覽器端建立了一個Cookie對象;經過客戶端帶上來Cookie對象來與服務器端的session對象匹配來實現狀態管理的。默認的,當咱們關閉瀏覽器的時候,cookie會被刪除。但能夠經過修改cookie 的expire time使cookie在必定時間內有效
Token Auth:
Token Auth的優勢
Token機制相對於Cookie機制又有什麼好處呢?
localStorage是html5的一種新的本地緩存方案,目前用的比較多,通常用來存儲ajax返回的數據,加快下次頁面打開時的渲染速度。沒有過時時間設置。通常能夠在裏面存一個時間戳,每次從裏面取出這個時間進行人工判斷是否過時。
API:
localStorage.setItem()
localStorage.getItem()
localStorage.removeItem()
localStorage.clear()
sessionStorage屬性容許你訪問一個session storage對象。它與localStorage類似,不一樣之處在於localStorage裏面存儲的數據沒有過時時間設置,而存儲在sessionStorage裏的數據會在頁面會話結束時被清除。頁面會話在瀏覽器打開期間一直保持,而且從新加載或恢復頁面仍會保持原來的頁面會話。在新標籤或窗口打開一個頁面會初始化一個新的會話,這點和session cookies的運行方式不一樣。
應該注意的是:不管是sessionStorage仍是localStorage中保存的數據都僅限於該頁面的協議,簡單來講就是不容許跨域。
語法:
// 保存數據到sessionStorage sessionStorage.setItem('key', 'value'); // 從sessionStorage獲取數據 var data = sessionStorage.getItem('key'); // 從sessionStorage刪除保存的數據 sessionStorage.removeItem('key'); // 從sessionStorage刪除全部保存的數據 sessionStorage.clear();