理解cookie和session

前段时候和同事讨论了cookie,无结果,今天用实践来检验一下真理。

 

我用的是(Win32) PHP/5.2.5语言和Apache/2.2.6服务器 (但本次讨论session和cookie跟服务器和语言无关,所以你如果你不懂PHP也没关系,你用别的服务器也是可以地。)

 

第一步:

所先来看一下,我做了两个页面A.php和B.php. A.php中有个链接到B.php中,B.php中也有个链接到A.php中。

现在我们第一次请求页面A.php 发生了1动作。再点击A.php页面中的连接发生2动作请求到B.php,再点击B.php中的连接发生3动作返回到A.php页面中。如下图:

现在我们来看一下这三次请求和返回的header信息,注意每一次请求和返回都有header,所以有分

请求头信息 

返回头信息

  

 

我们看到,没有发生sessioncookie的发送和返回,因为我们没有在代码中写关于sessioncookie的设置。

 

第二步:

 

现在我们对页面A.php中加入代码。如图:

先看一下添加的代码:

 

$_SESSION['name']='zsk'     服务器添加一个名为name值为zsksession

setcookie('name','zsk02')   服务器添加一个名为name值为zsk02cookie

 

 

 

如上图,再进行上面的步骤,发生三次请求,并多加一步从A.php再链接到B.php发生第四次动作。

 

 

现在我们来看一下这四次请求和返回的header信息,如下图:

 

第一次动作:

 

l  请求头信息中没有cookiesession.因为是第一次请求嘛。

 

l  返回头信息

a)  返回了session:PHPSESSID=5732c32c044a4ab6fb1c184c807b4781

b)  返回了cookie:name=zsk02

 


第二次请求:

 

l  请求头信息中有,就是上一步返回的session和cookie,把这两个发送给服务器

 

 

l  返回头信息中,没有cookiesession

 


 

第三次请求:

 

l  请求头信息中有,跟第二次请求一样,有session和cookie

 

 

l  返回头信息

a)  返回了cookie:name=zsk02

 


第四次请求:和第二次一样的请求头信息和一样的返回头信息

 

l 请求头信息中有,session和cookie,把这两个发送给服务器


 

l  返回头信息中,没有cookiesession


 

如果我在这里禁用了浏览器的所有cookie。会发生什么呢? 答案是  服务器返回的时候会有session和cookie。 但是请求的时候都不会有session和cookie.

 


 


 

提醒大家:

1.当第一次请求一个网站,网站返回有session时只返回sessionID。当再请求这个网站的任何页面,都会把sessionID发送到服务器,页面返回不再有session ID 

2.当一个网站的请求页面有cookie时,再请求这个页面还会返回cookie,请求这个网站的任何页面,都会把所有cookie的名和值都发送到服务器。

3.当我们把浏览器上的cookie禁掉。页面会每次返回一个不同的session ID.

 

关于session,必要条件是我们请求的网站需要识别同一个用户的请求,如用户登入。这样在用户第一次请求时因为没的sessionID,服务器给用户建立一个随机的sessionID(这个sessionID是唯一的,用于识别不同的用户),并返回给用户,当用户再请求时会把sessionID返回给服务器,服务器收到sessionID就知道这个用户是哪一个用户了。如果用户关闭了浏览器,则浏览器保存sessionID就会消失,但用服务器内的sessionID还在,如果过了一段时间(一般为20分钟,由服务器配置决定),服务器没有收到已保存的sessionID,服务器就抛弃了这个sessionId如果用户禁用cookie, 用户请求时,服务器也是会为用户建立一个sessionID并返回给浏览器,但是此时浏览器不保存起来,当用户再次请求时没有sessionID发送到服务器,服务器认为这个用户是第一次请求,给用户建立一个随机的sessionID,这样每次用户请求时都当做第一次请求,都会建立一个新的sessionID并返回给浏览器,可浏览器就是不接收。

 

 

关于cookie,如果服务器发送一个cookie到浏览器,浏览器就保存了这个cookie,一个cookie包括cookie名和cookie值。浏览器每次再请求这个网站的时候都会把这个cookie名值发送给服务器。 如果用户禁用cookie, 用户请求时,服务器也是会发送cookie给浏览器,但是此时浏览器不保存起来(跟session一样)。

 

 

Sessioncookie的区别:

服务器只把sessionID发送给浏览器,session的值保存在服务器中,每次浏览器请求都会把sessionID发送给服务器。 服务器通过sessionID识别同一个浏览器的请求。

Cookie则是把cookie的名和值保存在用户的电脑里,浏览器每次请求都会把cookie名和值发送给服务器。

 

因为cookie在用户的电脑里,所以看以被查看到,也可以被修改。也可以在本地被建立,javascrip脚本也可以写cookie,javascript建立的cookie和服务器建的cookie是一样的,没有本质的差别,可以相互识别和修改。

 


 

 

 

现在我们第一次请求页面A.php,如下图,


发生了1动作。再点击A.php页面中的连接发生2动作请求到B.php,再点击B.php中的连接发生3动作返回到A.php页面中。

posted @ 2010-07-15 18:02  z s k  阅读(1000)  评论(9编辑  收藏  举报