淺談Cookie、Session與Cache的區別

     之前實現數據的緩存有多種方法,如客戶端的Cookie,服務器端的Session、Application。web

     1、Cookieredis

     Cookie是保存客戶端的一組數據,主要用來保存用戶的我的信息,主要存放瀏覽器請求服務器時的請求信息,這些信息是非敏感信息。主要用於當用戶訪問您的系統時,應用程序能夠檢索之前存儲的信息。
數據庫

     一、保存時間能夠根據須要進行設置:數組

          1)若是沒有設置Cookie失效日期,它的生命週期保存到關閉瀏覽器爲止;瀏覽器

          2)若Cookie對象的Expires屬性設置爲MinValue,表示永不過時;緩存

     二、Cookie存儲的數據量受限制,大多數的瀏覽器約束爲4KB左右,因此不要存放太大數據。安全

     三、Cookie的關鍵特性:服務器

          1)存儲在客戶端的磁盤上;session

          2)是與用戶相關的數據;性能

          3)在必定的時間內持久化存儲;

          4)能夠跨瀏覽器共享數據;

          5)數據須要被序列化;

          6)會發生客戶端與服務器端數據傳輸;

          7)用戶相關;

     2、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)數據不被序列化;

     3、Cache

     Cache存儲於服務器的內存中,容許您自定義如何緩存數據項,以及緩存多長時間。當系統缺少內存時,緩存會自動移除不多使用的或優先級較低的緩存項,以釋放內存,此過程稱爲清理。這是緩存爲了確保過時數據再也不佔用寶貴的服務器資源的方式之一。它不與會話相關,因此它是多會話共享的,所以緩存能夠提升系統性能。同時有可能會泄露用戶信息,另外在獲取數據時還須要檢測該緩存項是否還存在。

     Cache的關鍵特性:

          1)Cache用於在Http請求期間保存頁面或者數據;

          2)Cache的使用能夠大大提升整個系統的效率;

          3)因爲Cache的使用是將頻繁訪問的數據放在內存中,當用戶發出相同的請求後,服務器不會再次處理,而是直接緩存結果返回給用戶。因此,Cache節省的是服務器處理時間

          4)對於緩存與應用程序在一塊兒的狀況,當應用程序重啓將從新建立其實例;

          5)與會話無關

          6)根據服務器資源的情況,緩存項隨時可能被丟棄;

          7)數據不被序列化;

          8)Cache不會發生客戶端與服務器端數據傳輸;

     4、總結

     一、因爲Session依賴於客戶端Cookie(SessionID是存放於Cookie中的),所以不支持Cookie的瀏覽器,Session也會丟失,固然能夠用Session Url重寫來解決此問題。

     二、Cookie不建議存放大數據量(如存一個表格數據等),由於Cookie的值在每次Web頁面請求往返的過程當中都是要附在Http頭中的,若是太大會佔用客戶端與服務器端之間的帶寬,若是多個鏈接訪問就是N*4KB,當用戶多了,就會成爲瓶頸之一。

     三、Cache也要佔用服務器的內存,可是比Session要多一些靈活性,但要注意哪些數據須要緩存,哪些本就不須要緩存。

     四、針對用Cache替換Session,對於單一系統來講,是徹底不須要注意什麼的。如果針對單點登陸來講,同一帳號能夠訪問幾個系統。或者在同一電腦中在不一樣的頁面中訪問不一樣的系統,那在作Cache數據保存時,應該根據不一樣的系統惟一標識來保存針對不一樣系統數據的緩存,以達SessionID的做用(固然還有其餘實現方案)。不然,對於前面登陸的系統,在Cache中永遠是最後一個系統的緩存數據,當刷新前面系統時,始終展示的是最後一個系統的操做。

     五、固然,session也能夠不以cache的形式進行處理,由於像redis,memacache中有專門針對session共享的解決方案。

相關文章
相關標籤/搜索