理解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,所以有分
请求头信息和
返回头信息
我们看到,没有发生session和cookie的发送和返回,因为我们没有在代码中写关于session和cookie的设置。
第二步:
现在我们对页面A.php中加入代码。如图:
先看一下添加的代码:
$_SESSION['name']='zsk' 服务器添加一个名为name值为zsk的session
setcookie('name','zsk02') 服务器添加一个名为name值为zsk02的cookie
如上图,再进行上面的步骤,发生三次请求,并多加一步从A.php再链接到B.php发生第四次动作。
现在我们来看一下这四次请求和返回的header信息,如下图:
第一次动作:
l 请求头信息中没有cookie和session.因为是第一次请求嘛。
l 返回头信息中
a)
返回了session:PHPSESSID=5732c32c044a4ab6fb1c184c807b4781
b)
返回了cookie:name=zsk02
第二次请求:
l 请求头信息中有,就是上一步返回的session和cookie,把这两个发送给服务器
l 返回头信息中,没有cookie和session
第三次请求:
l 请求头信息中有,跟第二次请求一样,有session和cookie
l 返回头信息中
a)
返回了cookie:name=zsk02
第四次请求:和第二次一样的请求头信息和一样的返回头信息
l 请求头信息中有,session和cookie,把这两个发送给服务器
l 返回头信息中,没有cookie和session
如果我在这里禁用了浏览器的所有cookie。会发生什么呢? 答案是 服务器返回的时候会有session和cookie。 但是请求的时候都不会有session和cookie.
提醒大家:
1.
当第一次请求一个网站,网站返回有session时只返回session的ID。当再请求这个网站的任何页面,都会把session的ID发送到服务器,
页面
返回不再有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一样)。
Session
和cookie的区别:
服务器只把session的ID发送给浏览器,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页面中。