session、cookie與“記住我的登錄狀態”的功能的實現

Cookie的機制

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。

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

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

一般瀏覽器提供了兩種方式來保存,還有一種是程序員使用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開發技術來具體實現這個功能。

 

本文原理實現源碼下載地址:代碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章