Session是一種服務器端的信息管理機制,它把這些文件信息以文件的形式存放在服務器的硬盤空間上(這是默認情況,可以用memcache把這種數據放到內存裡面)當客戶端向服務器發出請求時,要求服務器端產生一個session時,服務器端會先檢查一下,客戶端的cookie裡面有沒有session_id,是否過期。如果有這樣的session_id的話,服務器端會根據cookie裡的session_id把服務器的session檢索出來。如果沒有這樣的session_id的話,服務器端會重新建立一個。 PHPSESSID是一串加了密的字符串,它的生成按照一定的規則來執行。同一客戶端啟動二次session_start的話,session_id是不一樣的。
區別:Cookie 保存在客戶端瀏覽器中,而Session 保存在服務器上。 Cookie 機制是通過檢查客戶身上的“ 通行證” 來確定客戶身份的話,那麼Session 機制就是通過檢查服務器上的“ 客戶明細表” 來確認客戶身份。 Session 相當於程序在服務器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。
Cookie是存儲在客戶端瀏覽器中的數據,我們通過Cookie來跟踪與存儲用戶數據。
一般情況下,Cookie通過HTTP headers從服務端返回到客戶端。多數web程序都支持Cookie的操作,因為Cookie是存在於HTTP的標頭之中,所以必須在其他信息輸出以前進行設置,類似於header函數的使用限制。
PHP通過setcookie函數進行Cookie的設置,任何從瀏覽器發回的Cookie,PHP都會自動的將他存儲在$ _COOKIE的全局變量之中,因此我們可以通過$ _COOKIE['key']的形式來讀取某個Cookie值。
PHP中的Cookie具有非常廣泛的使用,經常用來存儲用戶的登錄信息,購物車等,且在使用會話Session時通常使用Cookie來存儲會話id來識別用戶,Cookie具備有效期,當有效期結束之後,Cookie會自動的從客戶端刪除。同時為了進行安全控制,Cookie還可以設置域跟路徑。
很多網站都會使用Cookie。例如,Google會向客戶端頒發Cookie,Baidu也會向客戶端頒發Cookie。那瀏覽器訪問Google會不會也攜帶上Baidu頒發的Cookie呢?或者Google能不能修改Baidu頒發的Cookie呢?
答案是否定的。 Cookie具有不可跨域名性。根據Cookie規範,瀏覽器訪問Google只會攜帶Google的Cookie,而不會攜帶Baidu的Cookie。 Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。
Cookie在客戶端是由瀏覽器來管理的。瀏覽器能夠保證Google只會操作Google的Cookie而不會操作Baidu的Cookie,從而保證用戶的隱私安全。瀏覽器判斷一個網站是否能操作另一個網站Cookie的依據是域名。 Google與Baidu的域名不一樣,因此Google不能操作Baidu的Cookie。
需要注意的是,雖然網站images.google.com與網站www.google.com同屬於Google,但是域名不一樣,二者同樣不能互相操作彼此的Cookie。
注意:用戶登錄網站www.google.com之後會發現訪問images.google.com時登錄信息仍然有效,而普通的Cookie是做不到的。這是因為Google做了特殊處理。本章後面也會對Cookie做類似的處理。
Unicode編碼:保存中文
中文與英文字符不同,中文屬於Unicode字符,在內存中佔4個字符,而英文屬於ASCII字符,內存中只佔2個字節。 Cookie中使用Unicode字符時需要對Unicode字符進行編碼,否則會亂碼。
提示:Cookie中保存中文只能編碼。一般使用UTF-8編碼即可。不推薦使用GBK等中文編碼,因為瀏覽器不一定支持,而且JavaScript也不支持GBK編碼。
BASE64編碼:保存二進製圖片
Cookie不僅可以使用ASCII字符與Unicode字符,還可以使用二進制數據。例如在Cookie中使用數字證書,提供安全度。使用二進制數據時也需要進行編碼。
%注意:本程序僅用於展示Cookie中可以存儲二進制內容,並不實用。由於瀏覽器每次請求服務器都會攜帶Cookie,因此Cookie內容不宜過多,否則影響速度。 Cookie的內容應該少而精。
沒有留言:
張貼留言