cookie 和 session 机制

Cookie实际上是Web服务端与客户端(典型的是浏览器)交互时彼此传递的一部分内容,内容可以是任意的,但要在允许的长度范围之内。客户端会将它保 存在本地机器上(如IE便会保存在本地的一个txt文件中),由客户端程序对其进行管理,过期的Cookie会自动删除。
每当客户端访问某个域下某个目录中的网页时,便会将保存在本地并且属于那个域下对应目录的有效Cookie信息附在网页请求的头部信息当中一并发送给服务端。
  • Cookie文件的保存位置
Windows 2000/XP:C:\Documents and Settings\\Cookies\目录下。 (此处的为你登录系统时使用的用户名,在开始->运行中输入cookies便可打开该目录),命名规则为@.txt。    
Win 7:C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Cookies目录下。 (要去除文件夹选项中的"隐藏受保护的操作系统文件",才能看到)。
  • Cookie文件的格式
  IE的Cookie文件实际上就是一个txt文本文件,只不过换行符标记为Unix换行标记(0x0A),由于记事本对Unix换行标记不兼容,打开后内容全在一行看起来不方便,我们可以用EditPlus打开,打开之后,会看到形式如下的内容:

1 name 2 value

3 domain/ 4 1600 5 1263382784 6 30020896 7 452781968 8 30020892 9 *

内容说明:
第一行 Cookie变量名
第二行 Cookie变量值
第三行 该Cookie变量所属域,形如csdn.net/、blog.csdn.net/或blog.csdn.net/lixianlin/
第四行 可选标志
第五行 该Cookie过期时间(FILETIME格式)的高位整数
第六行 该Cookie过期时间(FILETIME格式)的低位整数
第七行 该Cookie创建时间(FILETIME格式)的高位整数
第八行 该Cookie创建时间(FILETIME格式)的低位整数
第九行 Cookie记录分隔符(为一个星号* )
补充一下,第三行中Cookie变量所属域,如csdn.net/,它是一个根域,也就是一级域,表示该Cookie变量在该根域下的所有目录中的网页都有效,不管访问该域下的哪个目录中的网页,浏览器都会将该Cookie信息附在网页头部信息当中发送给服务端;blog.csdn.net/,是一个二级域,表示该Cookie只对blog这个二级域下目录中的网页有效;blog.csdn.net/lixianlin/,是一个二级域下的目录,只有访问blog这个二级域下lixianlin这个目录中的网页时,才会把该Cookie信息附在请求头部信息当中发送给服务端。需要指出的是csdn.net/和www.csdn.net/并不相同,前者是根域,后者是一个二级域,只是人们习惯了www这样的形式,所以大多数的网站首页都用 http://www.xxx.com/这样的二级域来访问。

附FILETIME格式定义:

typedef struct _FILETIME {
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;
  • session机制
看下边先研究SESSION是如何启动的,当打开IE浏览网站后会发出一个指令请求SESSIONID以及对各个类型数据的下载许可,如图片、声音以及FLASH。 数据实际传输内容:
  1. IE到服务器
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Accept-Language0: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: www.souzz.net
on: Keep-Alive  
服务器会返回一个没有被使用的SESSIONID让IE使用,当时IE就对返回SESSIONID做存储并同时返回相关页面的下载数据:服务器到IE 
  HTTP/1.1 200 OK
  Server: Microsoft-IIS/5.0
  Date: Sun, 30 Nov 2003 16:41:51 GMT
  Content-Length: 21174..Content-Type: text/html
  Set-Cookie: ASPSESSIONIDCACBBBRT=IBOMFONAOJFEEBHBPIENJFFC; path=/
  Cache-control: private
然后就是页面HTML代码,此时这个IE程序(不是客户机)的SESSIONID就为IBOMFONAOJFEEBHBPIENJFFC。而当IE在访问任何这个站点的ASP程序的时候,就会把IBOMFONAOJFEEBHBPIENJFFC发送给服务器,服务器就会知道IBOMFONAOJFEEBHBPIENJFFC是表示你而在服务器上设置SESSION("name")="name"。完全可以看成是SESSION("IBOMFONAOJFEEBHBPIENJFFC")("name")="name" 或者 SESSION(SESSIONID)("name")="name" 这样,SESSION就区分开用户了。 而当服务器反馈这个ID的时候会看这个ID有没有被使用。如果有就再换一个,反正不会让你重复。如果想模拟某人的SESSION的ID来进行欺骗是可以的,不过要获取到对方IE传输信号,并且在保证当时这个SESSIONID没有被取消的情况下才可能实施。
session_start();

//这种方法是将原来注册的某个变量销毁
unset($_SESSION["admin"]);

//这种方法是销毁整个 Session 文件
session_destroy(); 
2.Session 是如何来判断客户端用户的呢?
它是通过 Session ID 来判断的,什么是 Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 Session ID。
如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 Session 生存期的角色。
3.手动设置 Session 的生存期:
session_start();
//保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/"); 
其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:
//保存一天
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
如果客户端使用 IE 6.0 , session_set_cookie_params(); 函数设置 Cookie 会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie。
4.假设客户端禁用 Cookie 怎么办?
没办法,所有生存周期都是浏览器进程了,只要关闭浏览器,再次请求页面又得重新注册 Session。
5.那么怎么传递 Session ID 呢?
通 过 URL 或者通过隐藏表单来传递,PHP 会自动将 Session ID 发送到 URL 上,URL 形如:http://www.openphp.cn/index.php? ... e5b44cfa01d49cf9669,其中 URL 中的参数 PHPSESSID 就是 Session ID了,我们可以使用 $_GET 来获取该值,从而实现 Session ID 页面间传递。
  • Session的存储方式

1.session其实分为 客户端Session 和 服务器端Session。

当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在 HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。这个SessionID就是保存在客户端的,属于客户端 Session。

其实客户端Session默认是以cookie的形式来存储的,所以当用户禁用了cookie的话,服务器端就得不到SessionID。这时我们可以使用url的方式来存储客户端Session。也就是将SessionID直接写在了url中,当然这种方法不常用。
在PHP中可以通过定义session_set_save_handler,将服务器session数据存储在不同的介质上,比如存储在文件里,apc或memcache缓存中,或存储在数据库里。可对统计在线人数,或踢除特定会员的登陆状态等等。
  • cookie和session区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。(默认都是以文件方式存储)
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、单个cookie在客户端的限制是4K,每个域的cookie不能超过20个,session仅受操作系统允许的最大文件尺寸限制。
  • 总结
1、cookie作用域问题,当你设置的cookie,其它页面取不到值时,可考虑这方面原因。    可设置下path参数,参考"http://hi.baidu.com/brucehawking/item/ecbcb04d71d288e1bdf451d1"    贴上我的js设置cookie函数,这里"path=/",表示作用域为服务器的localhost下,可自行更改。
/**
 * 设置cookie
 * @param c_name cookie名
 * @param value cookie值
 * @param expiredays cookie过期时间
 * @return
 */
function setCookie(c_name, value, expiredays) {
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + expiredays);
    document.cookie = c_name+ ‘=‘ +escape(value) + ‘;path=/;‘ + ((expiredays == null) ? ‘‘ : ‘expires=‘+exdate.toGMTString());
}
2、在同一个服务器上的所有网站会共用session,所以要注意当开发的多个项目在同一个服务器上时,session的命名要考虑到避免冲突,最好每个项目中的session都加个前缀。3、销毁session时也要注意,不要销毁整个session,避免将同服务器下的其它站点的session销毁掉。
unset($_SESSION[‘[prefix_username‘]); //不要unset($_SESSION);
参考:http://www.oschina.net/question/4873_12909http://www.cnblogs.com/jqyp/archive/2010/08/31/1813960.htmlhttp://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.htmlhttp://leexuan.blogbus.com/logs/1932967.html
时间: 2024-10-06 08:46:22

cookie 和 session 机制的相关文章

理解Cookie和Session机制

转自:http://my.oschina.net/xianggao/blog/395675 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. Cookie机制 Cookie技术是客户端的解决方案,Cooki

理解Cookie和Session机制(转)

目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie的有效期 Cookie的修改.删除 Cookie的域名 Cookie的路径 Cookie的安全属性 JavaScript操作Cookie 案例:永久登录 Session机制 什么是Session 实现用户登录 Session的生命周期 Session的有效期 Session的常用方法 Session

Cookie和Session机制详解

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. ?Cookie是客户端技术,程序(服务器)把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着

Cookie 和 Session机制具体解释

原文地址:http://blog.csdn.net/fangaoxin/article/details/6952954 会话(Session)跟踪是Web程序中经常使用的技术.用来跟踪用户的整个会话.经常使用的会话跟踪技术是Cookie与Session.Cookie通过在client记录信息确定用户身份.Session通过在server端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制.并比較说明什么时候不能用Cookie,什么时候不能用Session. 1.1 Cook

正确理解cookie和session机制原理

php中cookie和session是我们常用的两个变量了,一个是用户客户端的,一个用在服务器的但他们的区别与工作原理怎么样,下面我们一起来看看cookie和session机制原理吧. cookie和session机制之间的区别和联系 具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而session机制采用的是一种在客户端与服务器之间保持状态的解决

cookie和session机制

一.cookie和session机制之间的区别和联系 1.cookie机制 Cookie意为"甜饼",是由W3C组织提出,最早由Netscape社区发展的一种机制.目前Cookie已经成为标准,所有的主流浏览器如IE.Netscape.Firefox.Opera等都支持Cookie. Cookie的含义是"服务器送给浏览器的甜点",即服务器在响应请求时可以将一些数据以"键-值"对的形式通过响应信息保存在客户端.当浏览器再次访问相同的应用时,会将原

关于cookie的文章(cookie与session机制)

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个

关于HTTP中cookie 和session机制

前言 Cookie是由网景公司的前雇员Lou Montulli 在1993年发明的.向前辈致敬. 1. Cookie和Session介绍  Cookie 和Session 是为了在无状态下HTTP协议之上维护会话状态,使得服务器可以知道当前适合哪个客户在打交道.因为HTTP协议是无状态的,即每次用户请求到达服务器时,HTTP服务器并不知道这个用户是谁.是否登录过等.现在的服务器之所以知道我们是否已经登录,是因为服务器在登录时设置了浏览器的Cookie!Session则是借由Cookie而实现的更

Cookie与session机制深入分析

                                                cookie的滞后性与session比较 当我们在当前页面设置cookie后,在当前页面取cookie是无法取到的 只有当我们再次刷新页面,再次发起http请求,我们就会取到cookie的值 Session机制,在当前页面设置session,是可以取到session的值 实验: 当我将浏览器cookie禁止后,当前页面设置的session依旧可以取出来 代码: 结果: 图Session_id1 但当我