- 論壇徽章:
- 1
|
眾所周知,http協(xié)議是一個(gè)無狀態(tài)協(xié)議,簡(jiǎn)單來說就是,web服務(wù)器是不知道現(xiàn)在連接上來的人到底是哪個(gè)人,為了滿足選擇性發(fā)送信息的需求,在http的基礎(chǔ)上做了很多擴(kuò)展來達(dá)到這個(gè)目的,如數(shù)字簽名、cookie、session等。
web服務(wù)器或者web程序如何能夠知道現(xiàn)在連接上來的是誰?要解決這個(gè)問題,首先需要在服務(wù)器端和客戶端建立一一對(duì)應(yīng)關(guān)系,下邊我通過抓取http的內(nèi)容來說明這種對(duì)應(yīng)關(guān)系是如何建立的。
我使用的是一個(gè)叫做httplook的http包嗅探工具,然后在本地web服務(wù)器的根目錄下建立一個(gè)叫test.php的文件,地址是:http://localhost/test.php,一切就緒以后我通過瀏覽器反復(fù)打開這個(gè)頁(yè)面。
- <?php
- session_start();
- if (isset($_SESSION['test_sess'])){
- $_SESSION['test_sess']++;
- }else{
- $_SESSION['test_sess'] = 0;
- }
- echo $_SESSION['test_sess'];
- ?>;
復(fù)制代碼
以下是前兩次向服務(wù)器發(fā)出的信息及服務(wù)器返回的信息
原帖由 "第一次請(qǐng)求服務(wù)器" 發(fā)表:
GET /test.php HTTP/1.1
Accept: */*
Referer: http://localhost/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)
Host: localhost
Connection: Keep-Alive 原帖由 "服務(wù)器第一次返回" 發(fā)表:
HTTP/1.1 200 OK
Date: Fri, 26 Aug 2005 07:44:22 GMT
Server: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2
X-Powered-By: PHP/5.0.4
Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 1
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Content-Language: Off 原帖由 "第二次請(qǐng)求服務(wù)器" 發(fā)表:
GET /test.php HTTP/1.1
Accept: */*
Referer: http://localhost/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)
Host: localhost
Connection: Keep-Alive
Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3 原帖由 "服務(wù)器第二次返回" 發(fā)表:
HTTP/1.1 200 OK
Date: Fri, 26 Aug 2005 07:44:23 GMT
Server: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2
X-Powered-By: PHP/5.0.4
Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 1
Keep-Alive: timeout=15, max=98
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Content-Language: Off
仔細(xì)對(duì)比這些輸出,第二次請(qǐng)求比第一次請(qǐng)求多出來的就是:
Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
這個(gè)header將會(huì)向服務(wù)器發(fā)送一個(gè)cookie信息,告訴服務(wù)器我有一個(gè)cookie,名字叫PHPSESSID,內(nèi)容是bmmc3mfc94ncdr15ujitjogma3。
這個(gè)cookie是怎么來的呢?看第一次服務(wù)器返回的信息里邊有:
Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/
這是服務(wù)器向客戶端瀏覽器寫一個(gè)cookie,名字是PHPSESSID,值是bmmc3mfc94ncdr15ujitjogma3,這個(gè)值實(shí)際就是所謂的session_id。
繼續(xù)看第二次向服務(wù)器發(fā)出的請(qǐng)求,仍然向服務(wù)器發(fā)送了PHPSESSID這個(gè)cookie
可以得到以下結(jié)論:
1、只要使用了session,就會(huì)通過cookie的方式向客戶端瀏覽器發(fā)送session
2、每次向服務(wù)器發(fā)出請(qǐng)求的時(shí)候,本地瀏覽器會(huì)把cookie附帶在請(qǐng)求信息中
說到這里,服務(wù)器端和客戶端如何通過session做到一一對(duì)應(yīng)的答案就很清楚了,明白了這個(gè)道理,對(duì)于使用session有很大幫助,請(qǐng)細(xì)細(xì)體會(huì)。 |
|