Cookie的機制
Cookie是瀏覽器(User Agent)訪問一些網站后,這些網站存放在客戶端的一組數據,用於使網站等跟蹤用戶,實現用戶自定義功能。
Cookie的Domain和Path屬性標識了這個Cookie是哪一個網站發送給瀏覽器的;Cookie的Expires屬性標識了Cookie的有 效時間,當Cookie的有效時間過了之后,這些數據就被自動刪除了。
如果不設置過期時間,則表示這個Cookie生命周期為瀏覽器會話期間,只要關閉瀏覽器窗口,Cookie就消失了。這種生命期為瀏覽會話期的 Cookie被稱為會話Cookie。會話Cookie一般不保存在硬盤上而是保存在內存里。如果設置了過期時間,瀏覽器就會把Cookie保存到硬盤 上,關閉后再次打開瀏覽器,這些Cookie依然有效直到超過設定的過期時間。存儲在硬盤上的Cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗 口。而對於保存在內存的Cookie,不同的瀏覽器有不同的處理方式。(設置age為負數就是窗口cookie,設置0刪除cookie,設置正數存活的時間)
Session的機制
Session是存放在服務器端的類似於HashTable結構(每一種Web開發技術的實現可能不一樣,下文直接稱之為HashTable)來存放用戶 數據,當瀏覽器第一次發送請求時,服務器自動生成了一個HashTable和一個Session ID用來唯一標識這個HashTable,並將其通過響應發送到瀏覽器。當瀏覽器第二次發送請求,會將前一次服務器響應中的Session ID放在請求中一並發送到服務器上,服務器從請求中提取出Session ID,並和保存的所有Session ID進行對比,找到這個用戶對應的HashTable。
一般情況下,服務器會在一定時間內(默認20分鍾)保存這個HashTable,過了時間限制,就會銷毀這個HashTable。在銷毀之前,程序員可以 將用戶的一些數據以Key和Value的形式暫時存放在這個HashTable中。當然,也有使用數據庫將這個HashTable序列化后保存起來的,這 樣的好處是沒了時間的限制,壞處是隨着時間的增加,這個數據庫會急速膨脹,特別是訪問量增加的時候。一般還是采取前一種方式,以減輕服務器壓力。
以上復制於:http://www.cnblogs.com/aspnet_csharp/archive/2012/10/18/2729609.html
1:使用Cookie保存登錄狀態
場景:當我們登錄新浪微博之后,過了2天沒有在登陸的話,第三天你打開微博發現依舊不用登錄(這里說的是瀏覽器訪問微博,不是客戶端)。一般不是很了解http的新人可能以為是服務器端session的存活時間設置的足夠長!!其實可以如果要是了解session跨窗口共享的原理你就會發現肯定不是把session設置足夠長存活時間實現的(可以參考下面2)。而且服務器端session存活時間設置太長的話會導致常見大量session存於內容,會導致內存占用量過高,更不符合實際需求。
所以針對這個問題,一般解決方案就是使用cookie,在本地保存一個登錄狀態(可以設置cookie的存活時間,也就是設置用戶免密碼登錄的有效時間),每一個請求的時候攜帶上cookie,在后台通過判斷cookie的登錄狀態進行處理是否登錄成功。當cookie保存的用戶登錄狀態失效之后就需要我們輸入用戶名和密碼手動點擊登錄了。

2:session如何實現跨窗口的?
因為每一個會話有一個sessionId。該SessionId是在瀏覽器本地的cookie中存儲的,而每一個SessionId的過期時間是瀏覽會話結束時。所以只要當前瀏覽器窗口沒有關閉,該sessionId依舊是存活的。由於cookie是被同一個瀏覽器多個進程共享的,所以當你新打開一個瀏覽器進行訪問的時候(雙擊圖標打開瀏覽器,也可以是新建tab),在訪問你上次訪問的網站,還可以直接登錄,無需手動輸入密碼點擊登錄。這其中的原理就是:由於上一個登錄的窗口沒有關閉導致其sessionid在cookie中依舊是存活的,然后第二個瀏覽器訪問時候共享該cookie中的同一個sessionId,共享一個sessionId在服務器端的效果就是共享一個session會話,由於服務器端的session中保存了你的登錄狀態,所以你可以直接登錄,無需輸入密碼,這就是session可以跨窗口分享的原因(cookie存儲sessionid供分享)。

拓展:
我們也可以模擬cookie的實現原理,將狀態使用數據庫,Redis等存儲工具保存狀態。
