程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> cookie與session的故事[原理篇]

cookie與session的故事[原理篇]

編輯:PHP綜合

  引語:cookie和session在網站開發中,起著均可厚非的重要作用,但是我們平時往往都只是通過某種語言作為介質,通過某些接口函數進行cookie和session的操作,而對其原理可能不了解或一知半解。這樣的話,對於一個真正的懂技術的人來說,也算是一種遺憾吧。雖然網絡上有許多的關於cookie和session的文章,但是我始終相信,一萬個讀者就有一萬個哈姆雷特,我也只是其中一個讀者,我希望站在一個獨立的角度去解說這個問題,希望對某些好奇的朋友或者想了解的朋友,作為參考!

  Session 與 Cookie 都是為了保持訪問用戶與後端服務器的交互狀態的介質。

1. 什麼是Cookie

  Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社區發展的一種機制。目前Cookie已經成為標准,所有的主流浏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。

  由於HTTP是一種無狀態的協議,服務器單從網絡連接上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。

  Cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端浏覽器頒發一個Cookie。客戶端浏覽器會把Cookie保存起來。當浏覽器再請求該網站時,浏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還可以根據需要修改Cookie的內容。

  注意:Cookie功能需要浏覽器的支持。如果浏覽器不支持Cookie(如大部分手機中的浏覽器)或者把Cookie禁用了,Cookie功能就會失效。

  不同的浏覽器采用不同的方式保存Cookie。

  IE浏覽器會在“C:\Documents and Settings\你的用戶名\Cookies”文件夾下以文本文件形式保存,一個文本文件保存一個Cookie。

  Cookie具有不可跨域名性。根據Cookie規范,浏覽器訪問Google只會攜帶Google的Cookie,而不會攜帶Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

  cookie是何時被刪除的?不設置過期時間,則表示這個cookie的生命期為浏覽器會話期間,關閉浏覽器窗口,cookie就消失。這種生命期為浏覽器會話期的cookie被稱為會話cookie。會話cookie一般不存儲在硬盤上而是保存在內存裡,當然這種行為並不是規范規定的。若設置了過期時間,浏覽器就會把cookie保存到硬盤上,關閉後再次打開浏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬盤上的cookie可以在不同的浏覽器進程間共享,比如兩個IE窗口。而對於保存在內存裡的cookie,不同的浏覽器有不同的處理方式。     

2. 什麼是Session
  Session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端浏覽器中,而Session保存在服務器上。客戶端浏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。客戶端浏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。session是服務器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息的。

  Session保存在服務器端。為了獲得更高的存取速度,服務器一般把Session放在內存裡。每個用戶都會有一個獨立的Session。如果Session內容過於復雜,當大量客戶訪問服務器時可能會導致內存溢出。因此,Session裡的信息應該盡量精簡。
  Session在用戶第一次訪問服務器的時候自動創建。需要注意只有訪問動態程序時才會創建Session,只訪問HTML、IMAGE等靜態資源並不會創建Session。如果尚未生成Session。
  Session生成後,只要用戶繼續訪問,服務器就會更新Session的最後訪問時間,並維護該Session。用戶每訪問服務器一次,無論是否讀寫Session,服務器都認為該用戶的Session“活躍(active)”了一次。

  Session長期不被使用,超過了超時時間沒訪問過服務器,Session就自動失效了(原理是被某進程清理干掉了)。

3. PHP中的session cookie原理

  PHP在http 協議的頭信息裡發送cookie,因此  setcookie()函數必須在其它信息被輸出到浏覽器前調用,這和對header()函數的限制類似。

  可以用 setcookie()或 setrawcookie()函數來設置 cookie。也可以通過向客戶端直接發送http頭來設置。要刪除cookie,只需把有效時間設為小於當前時間,和把值設置為空即可。

  通過php內置超級全局變量$_COOKIE 就可以讀取浏覽器端的cookie。

  session 使用過期時間設為0 的cookie,並且將一個稱為session ID 的唯一標識符(一長串字符串),在服務器端同步生成一些 session 文件(可以自己定義 session 的保存類型),與用戶機關聯起來。web應用程序存貯與這些 session 相關的數據,並且讓數據隨著用戶在頁面之間傳遞.訪問網站的來客會被分配一個唯一的標識符,即所謂的 SESSION ID。它要麼存放在客戶端的cookie,要麼經由 URL 傳遞.SESSION 允許用戶注冊任意數目的變量並保留給各個請求使用。當來客訪問網站時,PHP會自動(如果session.auto_start 被設為1)或在用戶請求時(由session_start()明確調用或session_register() 暗中調用)檢查請求中是否發送了特定的SESSION ID。如果是,則之前保存的環境就被重建。
  session最最核心的概念就是:網頁間跳轉的額外數據,保存在服務器,用一個id標識,浏覽器要維持session,需要每次提交都帶上這個id.

  通過$_SESSION這個變量進行設置和獲取。

  session是何時被刪除的?session.gc_maxlifetime 指定過了多少秒之後數據就會被視為"垃圾"並被清除。 垃圾搜集可能會在 session 啟動的時候開始( 取決於 session.gc_probability 和 session.gc_divisor)。 session.gc_probability 與 session.gc_divisor 合起來用來管理 gc(garbage collection 垃圾回收)進程啟動的概率。此概率用 gc_probability/gc_divisor 計算得來。例如 1/100 意味著在每個請求中有 1% 的概率啟動 gc 進程。session.gc_probability 默認為1,session.gc_divisor 默認為 100。

 

  末語:本文內容來源主要為網絡,通過一定的篩選,加上一定的個人理解而來,只為更方便查看!

  最後,我將本文精簡為一句話:cookie和session都是為了保存用戶的狀態而存在的,他在被訪問時被通過一定的安全機制算法生成,又通過浏覽器或某語言的一些特定進程(可以認為是守護進程)定期清理,session涉及內存及多服務器問題,可以將其保存到數據庫或其他地方解決該問題!

  ok...

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved