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序列化后保存起來的,這 樣的好處是沒了時間的限制,壞處是隨着時間的增加,這個數據庫會急速膨脹,特別是訪問量增加的時候。一般還是采取前一種方式,以減輕服務器壓力。
cookie和session的區別:
2,session 默認被存在在服務器的一個文件里(不是內存)
3,session 的運行依賴 session id,而 session id 是存在 cookie 中的,也就是說,如果瀏覽器 禁用了 cookie ,同時 session 也會 失效(但是可以通過其它方式實現,比如在 url 中傳遞 session_id)
4,session 可以放在 文件、數據庫、或內存中都可以。
5,用戶驗證這種場合一般會用 session
網站的免登陸是如何做到的?
方式一:首先想到的是使用cookie保存用戶登錄信息,設置有效期,在用戶下次訪問時免去登錄環節,直接通過cookie獲取用戶信息。
方式二:直接將session會話保存,用戶下次訪問時,繼續使用這個session。
相比之下session顯得更加安全,但是,大家知道,session會隨着瀏覽器的關閉而消失(確切的說,是在客戶端消失,服務器端的session存活周期取決於相應配置),當用戶下次啟動瀏覽器,訪問網站時,又會得到由網站自動分配的新的session。
那么,問題來了:如何做到關閉瀏覽器后到下次登錄時session仍然有效?
思路:
1、在用戶登錄成功時,創建session對象,保存用戶信息
2、將此session的sessionid保存到cookie中
setcookie('session_id',session_id(),time()+3600*24,"/","https://localhost:8080");
3、同時將sessionid於session對應關系存儲到應用域中,以便后面可以根據sessionid來獲取到session
4、在用戶關閉瀏覽器,重新打開瀏覽器訪問網站時,讀取用戶的cookie,得到sessionid
if(isset($_COOKIE['session_id'])){ session_id($_COOKIE['session_id']); }
5、根據sessionid獲取到第3步存儲到應用域中的session對象
6、從session中讀取用戶信息
