session、cookie與「記住個人登陸狀態」的功能的實現

Cookie的機制php

Cookie是瀏覽器(User Agent)訪問一些網站後,這些網站存放在客戶端的一組數據,用於使網站等跟蹤用戶,實現用戶自定義功能。程序員

Cookie的Domain和Path屬性標識了這個Cookie是哪個網站發送給瀏覽器的;Cookie的Expires屬性標識了Cookie的有 效時間,當Cookie的有效時間過了以後,這些數據就被自動刪除了。數據庫

若是不設置過時時間,則表示這個Cookie生命週期爲瀏覽器會話期間,只要關閉瀏覽器窗口,Cookie就消失了。這種生命期爲瀏覽會話期的 Cookie被稱爲會話Cookie。會話Cookie通常不保存在硬盤上而是保存在內存裏。若是設置了過時時間,瀏覽器就會把Cookie保存到硬盤 上,關閉後再次打開瀏覽器,這些Cookie依然有效直到超過設定的過時時間。存儲在硬盤上的Cookie能夠在不一樣的瀏覽器進程間共享,好比兩個IE窗 口。而對於保存在內存的Cookie,不一樣的瀏覽器有不一樣的處理方式。瀏覽器

Session的機制服務器

Session是存放在服務器端的相似於HashTable結構(每一種Web開發技術的實現可能不同,下文直接稱之爲HashTable)來存放用戶 數據,當瀏覽器第一次發送請求時,服務器自動生成了一個HashTable和一個Session ID用來惟一標識這個HashTable,並將其經過響應發送到瀏覽器。當瀏覽器第二次發送請求,會將前一次服務器響應中的Session ID放在請求中一併發送到服務器上,服務器從請求中提取出Session ID,並和保存的全部Session ID進行對比,找到這個用戶對應的HashTable。cookie

通常狀況下,服務器會在必定時間內(默認20分鐘)保存這個HashTable,過了時間限制,就會銷燬這個HashTable。在銷燬以前,程序員能夠 將用戶的一些數據以Key和Value的形式暫時存放在這個HashTable中。固然,也有使用數據庫將這個HashTable序列化後保存起來的,這 樣的好處是沒了時間的限制,壞處是隨着時間的增長,這個數據庫會急速膨脹,特別是訪問量增長的時候。通常仍是採起前一種方式,以減輕服務器壓力。併發

Session的客戶端實現形式(即Session ID的保存方法)jsp

通常瀏覽器提供了兩種方式來保存,還有一種是程序員使用HTML隱藏域的方式自定義實現:網站

[1] 使用Cookie來保存,這是最多見的方法,本文「記住個人登陸狀態」功能的實現正式基於這種方式的。服務器經過設置Cookie的方式將Session ID發送到瀏覽器。若是咱們不設置這個過時時間,那麼這個Cookie將不存放在硬盤上,當瀏覽器關閉的時候,Cookie就消失了,這個Session ID就丟失了。若是咱們設置這個時間爲若干天以後,那麼這個Cookie會保存在客戶端硬盤中,即便瀏覽器關閉,這個值仍然存在,下次訪問相應網站時,同 樣會發送到服務器上。加密

[2] 使用URL附加信息的方式,也就是像咱們常常看到JSP網站會有aaa.jsp?JSESSIONID=*同樣的。這種方式和第一種方式裏面不設置 Cookie過時時間是同樣的。

[3] 第三種方式是在頁面表單裏面增長隱藏域,這種方式實際上和第二種方式同樣,只不過前者經過GET方式發送數據,後者使用POST方式發送數據。可是明顯後 者比較麻煩。

實現「記住個人登陸狀態」的功能

前面咱們瞭解到,若是咱們將Session ID經過Cookie發送到客戶端的時候設置其過時時間爲1年,那麼在從此的一年時間內,客戶端訪問個人網站的時候都回將這個Session ID值發送到服務器上,服務器根據這個Session ID從內存或者數據庫裏面恢復存放Key-Value對的Hashtable。

其實這已經很好的實現了咱們的功能了。可是,前面也提到了,實際上Session並不會一直都存在的,過了必定的時間以後,服務器上的Session就被 銷燬了,以減輕服務器的訪問壓力。當服務器上的數據被銷燬後,即便客戶端上存放了Cookie也沒有辦法「記住個人登陸狀態」了。

通用的實現辦法是,將用戶的用戶名和加密以後的密碼也經過Cookie的方式存放在客戶端,當服務器上的Session銷燬之後,使用Cookie裏面存 放的用戶名和加密以後的密碼從新執行一次登陸操做,重建Session,並更新客戶端上Cookie中存放的的Session ID,而這個操做是發生在用戶請求一個須要身份驗證的頁面資源的背後,對於用戶來說是透明的,因而就達到了「記住個人登陸狀態」的目的了。

到目前爲止,已經基本明確了「記住個人登陸狀態」的實現方式和理論依據,後文將使用jsp和php兩種Web開發技術來具體實現這個功能。

設置cookie操做:

HttpCookie cookiesName = new HttpCookie("name");
cookiesName.Expires = System.DateTime.Now.AddHours(2);
cookiesName.Value = user.Name;
Response.Cookies.Add(cookiesName);

註銷cookie操做:

foreach (var item in Request.Cookies.AllKeys)
{
HttpCookie cookieName = Request.Cookies[item];
if(cookieName!=null)
{
cookieName.Expires = System.DateTime.Now.AddDays(-1);
Response.Cookies.Add(cookieName);
Request.Cookies.Remove(item);

}

}

相關文章
相關標籤/搜索