以前實現數據的緩存有多種方法,如客戶端的Cookie,伺服器端的Session、Application。 一、Cookie Cookie是保存客戶端的一組數據,主要用來保存用戶的個人信息,主要存放瀏覽器請求伺服器時的請求信息,這些信息是非敏感信息。主要用於當用戶訪問您的系統時,應用程式可以檢索以前存 ...
以前實現數據的緩存有多種方法,如客戶端的Cookie,伺服器端的Session、Application。
一、Cookie
Cookie是保存客戶端的一組數據,主要用來保存用戶的個人信息,主要存放瀏覽器請求伺服器時的請求信息,這些信息是非敏感信息。主要用於當用戶訪問您的系統時,應用程式可以檢索以前存儲的信息。
1、保存時間可以根據需要進行設置:
1)如果沒有設置Cookie失效日期,它的生命周期保存到關閉瀏覽器為止;
2)若Cookie對象的Expires屬性設置為MinValue,表示永不過期;
2、Cookie存儲的數據量受限制,大多數的瀏覽器約束為4KB左右,所以不要存放太大數據。
3、Cookie的關鍵特性:
1)存儲在客戶端的磁碟上;
2)是與用戶相關的數據;
3)在一定的時間內持久化存儲;
4)可以跨瀏覽器共用數據;
5)數據需要被序列化;
6)會發生客戶端與伺服器端數據傳輸;
7)用戶相關;
二、Session
Session是由應用伺服器維持的一個伺服器端的存儲空間,是一種保存上下文信息的機制,它是針對每一個用戶的。用戶在連接伺服器時,伺服器會生成一個唯一的SessionID,用該SessionID為標識符來存取伺服器端的Session存儲空間,面SessionID這一數據是以Cookie形式保存在客戶端。用戶提交頁面時,會將SessionID提交到伺服器端,來存取Session數據。這一過程是不用開發人員來干預的,所以一旦客戶端禁用Cookie,Session理論上也會失效,但伺服器也可以自動通過URL重寫的方式來傳遞SessionID的值,因此也不是完全依賴Cookie,並且這個過程對於開發人員是透明的。
所以,即使不寫Cookie,在使用Request.GetCookies()方法取出的Cookie數組長度也是1,而這個Cookie的名字就是JSessionID,還有一個很長的二進位字元串,這就是SessionID的值。
備註:
為什麼會有Cookie呢,大家都知道,Http是無狀態的協議,客戶每次讀取web頁面時,伺服器都打開新的會話,而且伺服器也不會自動維護客戶的上下文信息,那麼要怎麼才能實現網上商店中的購物車呢,Session就是一種保存上下文信息的機制,它是針對每一個用戶的,將變數的值保存在伺服器端,通過SessionID來區分不同的客戶,Session是以Cookie或URL重寫為基礎的,預設使用Cookie來實現,系統會創造一個名為JSessionID的輸出Cookie,我們叫做Session-Cookie,以區別Persistent-Cookie,也就是我們通常所說的客戶端Cookie,註意Session-Cookie是存儲於瀏覽器記憶體中的,並不是寫到硬碟上的,這也就是我們剛纔看到的JSessionID,我們通常情是看不到JSessionID的,但是當我們把瀏覽器的Cookie禁止後,Web伺服器會採用URL重寫的方式傳遞SessionID,我們就可以在地址欄看到SessionID=KWJHUG6JJM65HS2K6之類的字元串。
明白了原理,我們就可以很容易的分辨出Persistent-Cookie和Session-Cookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,Session-Cookie針對某一次會話而言,會話結束Session-Cookie也就隨著消失了,而Persistent-Cookie只是存在於客戶端硬碟上的一段文本(通常是加密的),而且可能會遭到Cookie欺騙以及針對Cookie的跨站腳本攻擊,自然不如Session-Cookie安全了。
通常Session-Cookie是不能跨視窗使用的,當你新開了一個瀏覽器視窗進入相同頁面時,系統會賦予你一個新的SessionID,這樣我們信息共用的目的就達不到了,此時我們可以先把SessionID保存在Persistent-Cookie中,然後在新視窗中讀出來,就可以得到上一個視窗SessionID了,這樣通過Session-Cookie和Persistent-Cookie的結合我們就實現了跨視窗的Session-Tracking(會話跟蹤)。
在一些Web開發的書中,往往只是簡單的把Session和Cookie作為兩種併列的Http傳送信息的方式,Session-Cookie位於伺服器端,Persistent-Cookie位於客戶端,可是Session又是以Cookie為基礎的。
Session的關鍵特性:
1)Session用來保存每一個用戶的專有信息;
2)Session的生存期是用戶持續請求時間加生存時間;
3)Session信息是保存在應用伺服器記憶體中,保存數據量可大可小;
4)用戶停止使用應用程式之後,Session仍在記憶體中停留一段時間,因此這種方法效率較低;
5)相較與在資料庫中存儲和檢索信息相比,它的執行速度會更快;
6)Session應用於單個用戶以其相應會話狀態。因此,適合存儲隨用戶的變化而變化的常用數據,或存儲關於用戶的安全數據;
7)Session不會發生客戶端與伺服器端數據傳輸;
8)會話相關;
9)在會話的整個生存期中,不會被主動丟棄;
10)數據不被序列化;
三、Cache
Cache存儲於伺服器的記憶體中,允許您自定義如何緩存數據項,以及緩存多長時間。當系統缺乏記憶體時,緩存會自動移除很少使用的或優先順序較低的緩存項,以釋放記憶體,此過程稱為清理。這是緩存為了確保過期數據不再占用寶貴的伺服器資源的方式之一。它不與會話相關,所以它是多會話共用的,因此緩存可以提高系統性能。同時有可能會泄露用戶信息,另外在獲取數據時還需要檢測該緩存項是否還存在。
Cache的關鍵特性:
1)Cache用於在Http請求期間保存頁面或者數據;
2)Cache的使用可以大大提高整個系統的效率;
3)由於Cache的使用是將頻繁訪問的數據放在記憶體中,當用戶發出相同的請求後,伺服器不會再次處理,而是直接緩存結果返回給用戶。所以,Cache節省的是伺服器處理時間;
4)對於緩存與應用程式在一起的情況,當應用程式重啟將重新創建其實例;
5)與會話無關;
6)根據伺服器資源的狀況,緩存項隨時可能被丟棄;
7)數據不被序列化;
8)Cache不會發生客戶端與伺服器端數據傳輸;
四、總結
1、由於Session依賴於客戶端Cookie(SessionID是存放於Cookie中的),因此不支持Cookie的瀏覽器,Session也會丟失,當然可以用Session Url重寫來解決此問題。
2、Cookie不建議存放大數據量(如存一個表格數據等),因為Cookie的值在每次Web頁面請求往返的過程中都是要附在Http頭中的,如果太大會占用客戶端與伺服器端之間的帶寬,如果多個連接訪問就是N*4KB,當用戶多了,就會成為瓶頸之一。
3、Cache也要占用伺服器的記憶體,但是比Session要多一些靈活性,但要註意哪些數據需要緩存,哪些本就不需要緩存。
4、針對用Cache替換Session,對於單一系統來說,是完全不需要註意什麼的。若是針對單點登錄來說,同一賬號可以訪問幾個系統。或者在同一電腦中在不同的頁面中訪問不同的系統,那在做Cache數據保存時,應該根據不同的系統唯一標識來保存針對不同系統數據的緩存,以達SessionID的作用(當然還有其他實現方案)。否則,對於前面登錄的系統,在Cache中永遠是最後一個系統的緩存數據,當刷新前面系統時,始終展現的是最後一個系統的操作。
5、當然,session也可以不以cache的形式進行處理,因為像redis,memacache中有專門針對session共用的解決方案。