淺談Cookie、Session與Cache的區別


     以前實現數據的緩存有多種方法,如客戶端的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-CookieSession-Cookie的區別了,網上那些關於兩者安全性的討論也就一目了然了,Session-Cookie針對某一次會話而言,會話結束Session-Cookie也就隨着消失了,而Persistent-Cookie只是存在於客戶端硬盤上的一段文本(通常是加密的),而且可能會遭到Cookie欺騙以及針對Cookie的跨站腳本攻擊,自然不如Session-Cookie安全了。

     通常Session-Cookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的SessionID,這樣我們信息共享的目的就達不到了,此時我們可以先把SessionID保存在Persistent-Cookie中,然后在新窗口中讀出來,就可以得到上一個窗口SessionID了,這樣通過Session-CookiePersistent-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共享的解決方案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM