我们在浏览网站时,访问的每一个web页面都需要使用HTTP协议实现。而HTTP协议是无状态协议,也就是说HTTP协议没有一个内建机制来维护两个事务之间的状态。当一个用户请求一个页面以后,再请求同一个网站上的其他页面时,HTTP协议不能告诉我们这两个请求是来自于同一个用户,会被当作独立的请求,而并不会将这两次访问联系在一起。
例如:在第一个页面中登录了一次,再转到同一个网站的其他页面时,如果还想使用该用户的身份访问,则必须重复执行记录的动作。因为HTTp协议是无状态的,所以不能在不同页面之间跟踪用户。
会话跟踪的方式
HTTP协议是无状态的协议,不能维护两个事务之间的状态
php实现了三种网页之间传递数据的方法:
1,使用超链接或者header()函数等重定向的方式
2,使用cookie将用户的状态信息存放在客户端的计算机之中,让其他程序能通过存取客户端计算机的COOKIE,来存取目前的使用者资料。
cookie:cookie是一种由服务器发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘上,在客户对该服务的请求中发回它。php透明地支持HTTP Cookie.可以利用它在远程浏览器端存储数据并以此来跟踪和识别用户的机制。cookie是存储在客户端的数据。
Cookie 是网站保存在浏览器客户端的信息,也就是说保存在访客的机器里的变量,一般随着 HTTP 头发送到服务器端。在 Cookie 生效之后及失效之前,客户每次发 出页面请求的时候(包括 PHP页面和静态 html 页面),都会把 Cookie 一块发送到服务器,只要我们针对它进行相应的处理,就可以实现变量”追随”。
cookie 可以跨越子域名。比如我们在 xiaofeicn.com 下面注册个个 cookie,那么可以在 bbs.xiaofeicn.com 上读取到该cookie。session 不可以跨越子域名:比 如 我 们 在 xiaofeicn.com 下 面 注 册 个 个 session , 那 么 不 可 以 在bbs.xiaofeicn.com,www.xiaofeicn.com 上读取到该 session。
a. 设置一个 Cookie 变量
设置一个 Cookie 变量,PHP 使用的函数是: int setcookie(string name, string value, int expire,string path, string domain, int secure);
其中 name 是 Cookie 变量名称标识,你在 PHP 中将可以象使用普通变量名一样来用它引用 Cookie 变量。value 是 Cookie 变量的初始 值,expire 表示该 Cookie 变量的有效时间;path 为该Cookie 变量的相关路径;domain 表示 Cookie 变量的网站;secure 则需在 https 的安全传输时才有效。 例如我们要设置一个变量 username,它的值是字符串”bluewind”,我们可以这么写代码: setcookie (“username”,”bluewind”); //这两个参数是 setcookie 必要的。我们还想给这个变量设置有效时间来限制操作超时等,比如说 10 分钟: setcookie(“username”,”bluewind”, 600000); //有效时间的单位是毫秒。注意:setcookie 和 header 函数一样,需要放在任何能向客户端输出的语句之前。
b. 销毁一个变量
销毁 Cookie 变量只要将它的 value 设为空(””)就可以了,如想销毁上面那个变量只要再写一次: setcookie (“username” ,””);
就可以了。这常用作安全退出之用。
c. Cookie 的有效范围和生存期
Cookie 的有效范围(也就是说在这个范围的页面都能得到这个 Cookie 变量)默认的是该目录及其子目录,当然你可以用 setcookie 的 path 和 domain 参数进行修改。如果你不对cookie 的expire 进行设置(参见 1. 设置一个 Cookie 变量中的例子),那么当你离开网站的页面,cookie也同时得到自动销毁。 http://www.netscape.com/newsref/std/cookie_spec.html 是
cookie 原创者 Netscape 所提供的完整介绍信息。
session:session是将数据存放于服务器系统之下。同一个用户在session中注册的变量,在会话期间各个web页面中这个用户都可以使用,每个用户使用自己的变量。
session 机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当 程序需要为某个客户端的请求创建一个 session 的时候,服务器首先检查这个客户端的请求里是否已包含了一个 session 标识-称为 sessionid,如果已包含一个 sessionid 则说明以前已经为此客户端创建过 session,服务器就按照 sessionid 把这个 session 检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含 sessionid,则为此客户端创建一个 session并且生成一 个与此 session 相关联的 sessionid,sessionid 的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 sessionid 将被在本次响应中返回给客户端保存。保存这个 sessionid 的方式可以采用 cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发给服务器。一般这个 cookie 的名字都是类似于 SEEESIONID。由 于 cookie 可以被人为的禁止,必须有其他机制以便在 cookie 被禁止时仍然能够把sessionid 传递回服务器。经常被使用的一种技术叫做 URL 重写,就是把 sessionid 直接附加在 URL 路径的后面,附加方式也有两种,一种是作为 URL 路径的附加信息,
表现形式为 http://xxx;SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另 一 种 是 作 为 查 询 字 符 串 附 加 在 URL 后 面 , 表 现 形 式 为
http://„../xxx?SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个SEEESIONID。
2. 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
3. Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。
所以,总结一下:
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
1,session主要存储 在服务器端,cookie 存储在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
5,用户验证这种场合一般会用 session
因此,维持一个会话的核心就是客户端的唯一标识,即 session id