PHP中SESSION與COOKIE的區別與聯繫

   

這兩者,區別和聯繫其實也挺深奧的,總是瞭解一些皮毛,每次都得上網查,今天寫下來,每隔段時間就看看,加深記憶。
 

  Session是由應用服務器維持的一個服務器端的存儲空間,用戶在連接服務器時,會由服務器生成一個唯一的SessionID,用該SessionID爲標識符來存取服務器端的Session存儲空間。而SessionID這一數據則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一SessionID提交到服務器端,來存取Session數據。這一過程,是不用開發人員干預的。所以一旦客戶端禁用Cookie,那麼Session也會失效。

   服務器也可以通過URL重寫的方式來傳遞SessionID的值,因此不是完全依賴Cookie。如果客戶端Cookie禁用,則服務器可以自動通過重寫URL的方式來保存Session的值,並且這個過程對程序員透明。

   可以試一下,即使不寫Cookie,在使用request.getCookies();取出的Cookie數組的長度也是1,而這個Cookie的名字就是JSESSIONID,還有一個很長的二進制的字符串,是SessionID的值。

   大家都知道,http是無狀態的協議,客戶每次讀取web頁面時,服務器都打開新的會話,而且服務器也不會自動維護客戶的上下文信息,那麼要怎麼才能實現網上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每一個用戶的,變量的值保存在服務器端,通過SessionID來區分不同的客戶,session是以cookie或URL重寫爲基礎的,默認使用cookie來實現,系統會創造一個名爲JSESSIONID的輸出cookie,我們叫做sessioncookie,以區別persistent cookies,也就是我們通常所說的cookie,注意sessioncookie是存儲於瀏覽器內存中的,並不是寫到硬盤上的,這也就是我們剛纔看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但是當我們把瀏覽器的cookie禁止後,web服務器會採用URL重寫的方式傳遞Sessionid,我們就可以在地址欄看到sessionid=KWJHUG6JJM65HS2K6之類的字符串。

   明白了原理,我們就可以很容易的分辨出persistent cookies和sessioncookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,sessioncookie針對某一次會話而言,會話結束session cookie也就隨着消失了,而persistentcookie只是存在於客戶端硬盤上的一段文本(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,自然不如sessioncookie安全了。

    通常sessioncookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們信息共享的目的就達不到了,此時我們可以先把sessionid保存在persistentcookie中,然後在新窗口中讀出來,就可以得到上一個窗口SessionID了,這樣通過sessioncookie和persistent cookie的結合我們就實現了跨窗口的session tracking(會話跟蹤)。

   在一些web開發的書中,往往只是簡單的把Session和cookie作爲兩種並列的http傳送信息的方式,sessioncookies位於服務器端,persistentcookie位於客戶端,可是session又是以cookie爲基礎的,明白的兩者之間的聯繫和區別,我們就不難選擇合適的技術來開發webservice了。

 

轉載自:http://blog.sina.com.cn/s/blog_76cd6de80100tlvp.html

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