(一)锰悼、session工作機(jī)制介紹
- 為每個(gè)訪問(wèn)者創(chuàng)建一個(gè)唯一的id(<b>UID</b>)
- 然后基于這個(gè)UID來(lái)存儲(chǔ)變量
- UID 存儲(chǔ)在 cookie 中刀闷,或者通過(guò) URL 進(jìn)行傳遞
(二)、舉個(gè)栗子
1仰迁、第一次訪問(wèn)某網(wǎng)站
這時(shí)服務(wù)器生成一個(gè)不重復(fù)的 <b>SESSIONID</b> 的文件甸昏,比如在/var/lib/php/session目錄。
2徐许、php會(huì)設(shè)置sessionid在返回的Response的HTTP頭
PHP的sessionid默認(rèn)的名字是<b>PHPSESSIONID</b>
3施蜜、客戶端接收到Set-Cookie,將PHPSESSIONID寫(xiě)入cookie
4雌隅、當(dāng)你第二次訪問(wèn)頁(yè)面時(shí)翻默,請(qǐng)求頭(Request)會(huì)攜帶cookie發(fā)送給服務(wù)器端
5、服務(wù)器根據(jù)cookie里的PHPSESSIONID去session目錄查找對(duì)應(yīng)session文件
6恰起、找到這個(gè)session文件后修械,檢查是否過(guò)期,如果沒(méi)有過(guò)期检盼,去讀取Session文件中的配置肯污;如果已經(jīng)過(guò)期,清空其中的配置
<p>如果客戶端禁用了Cookie,那PHPSESSIONID都無(wú)法寫(xiě)入客戶端蹦渣,Session還能用哄芜?
答案顯而易見(jiàn):不能
而且禁用cookie之后,服務(wù)端沒(méi)有接收到你cookie里面攜帶的<b>PHPSESSIONID</b>柬唯,那么基于HTTP是無(wú)狀態(tài)的认臊,那么你每一次請(qǐng)求,服務(wù)器都會(huì)當(dāng)作是第一次請(qǐng)求锄奢,這樣失晴,每次都會(huì)生成一個(gè)唯一的sessionid文件。
<p>
(三)斟薇、那么我們還能用session嗎师坎?
我可以通過(guò)參數(shù)來(lái)處理嘛。通過(guò)GET或者POST請(qǐng)求堪滨,傳遞參數(shù)的方式傳遞sessionid不就可以了嗎
GET http://www.xx.com/index.php?session_id=xxxxx
在渲染頁(yè)面的時(shí)候胯陋,強(qiáng)制的給一個(gè)sessionid,然后請(qǐng)求的時(shí)候再傳回來(lái)袱箱,不就和cookie的方式一樣了嗎遏乔。
但是這樣做的方式是不可取的。為什么发笔?
你只要將這個(gè)網(wǎng)站發(fā)送給別人盟萨,那么他將會(huì)以你的身份登錄并做所有的事情。
所以千萬(wàn)不要使用這種方式了讨,我只是舉這個(gè)栗子捻激,來(lái)讓大家更深刻的理解session的機(jī)制和原理。
(四)前计、現(xiàn)狀
在現(xiàn)在cookie幾乎是不會(huì)被禁用的胞谭,因?yàn)楝F(xiàn)在網(wǎng)站都非常依賴cookie。然而我們使用session的方式還是需要依賴cookie男杈,不要去使用參數(shù)傳遞這種不可取的方式丈屹。