为什么要使用会话控制
在我们平时浏览网页的时候,访问每个web页面都需要使用“http”协议实现,而这个协议是无状态协议,也就是说没有内嵌机制来链接两个事务之间的状态,当一个人用户请求一个人页面以后,在请求同一个网站上的另一个人页面的时候,HTTP协议不能告诉我们这个请两个请求是来自同一个用户会被当做是独立的请求,而不能将这两两次访问联系在一起,如下图:
当某网站的用户通过客户机的浏览器请求web服务器中的网页一的时候,该页面会经由服务器处理以后动态的将内容响应给浏览器显示,由于http协议的无状态性,当用户通过“网页一”中的链接,或在地址栏中直接输入web服务器URL来请求本站的其他网页时,会被看做和前一次毫无关系的连接和声用着相关的资料并不会自动传递到新情求的页面中。例如你在一个页面上登录了一次了,跳转到本站另一个页面的时候还是需要重新登陆一次,因为http协议是无状态的,不能再不同页面之间跟踪用户。
回话控制的思想就是允许服务器跟踪同一个用户做出的连续请求,当然除了使用会话控制在同一个网站中跟踪web用户之外,对一个访问者的请求还可以在多个页面之间为其共享数据。
会话跟踪方式:
http协议是无状态的协议,所以不能日湖两人事务之间的状态,但请求一个页面到请求另一个页面的时候,还要让服务器知道这是同一个用户,PHP系统为了防止这种事情的发生,提供了如下下面三种方法传递数据的方法:
1.使用超链接或者header()函数等重定向的方式,通过URL的GET请求中附加的参数的形式,将数据从一个页面转向另一个PHP脚本中,也可以通过网页中的各种隐藏的表单来储存使用者的资料,并将这些信息在提交表单的时候传递给服务器中的PHP脚本使用;
2.使用cookie将用户的状态信息存放在客户端的计算机当中,让其他程序能够通过存取用户端计算机的cookie才存取目前使用者的资料信息;
3.相对于cookie还可以使用seesion,将访问的状态存在服务器中,让其他的程序能透过服务器中的文件或数据库,来存取使用者信息
在上面三种页面数据的传递之中,使用URL的GET或HTTP POST方式 主要是用于处理参数的传递或者躲避输入的资料,适用于两个脚本之间的简单数据传递,例如:通过表单修改修改或者删除数据时,可以将在你数据库中对应的行ID传递给其他脚本。如果需要传递的数据多,页面传递的次数比较频繁,或者是需要传递数组时,用这种方法有点繁琐也别是在项目中跟踪一个用户的时候,要为不同权限的用户提供不同的动态页面,需要每个页面都知道现在的用户是谁,所以每个页面都能获取这个用户的相关信息。如果使用URL方式我们要在每个转向的页面的URL上都加上同样的用户信息,这样就给项目的开发人员带来了很大的困难,所以通常选用cookie或者session技术。
cookie的使用:
cookie是一种有服务器发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘上,在客户对该服务请求的时候发回它,PHP透明的支持http cookie。可以利用它在远程浏览器储存数据并以此来追踪和识别用户的机制,cookie是微博、服务器端给客户端但是cookie不是服务器白给客户端的,需要在客户端使用cookie为服务器记录一些信息。
cookie概述:
cookie是将使用者资料记录在客户端的技术,这种技术让web服务器能将一些只存储在客户端或者在客户端进行运算的资料,存放在用户的计算机系统当中,如此就不需要在连接服务器时,再通过网络传输,处理这些资料,进行提高页面处理的效率,降低服务器的负担,如下图:
假设某网站 的用户通过客户端的浏览器,访问web服务器中的“网页一”进行用户登录。当通过验证并成功登陆网站后,在网页一的PHP脚本中,会把这个用户的有关信息以键/值对的形式设置到客户端计算机的cookie中(通过http相应头部信息发送给客户端),当再次访问同一个服务器中其他PHP脚本的时候就会自动携带cookie中的数据一起访问(通过http请求头部信息传回服务器)。在服务器的每个脚本都可以接受cookie中的数据,并重新对登陆者的身份进行验证,而不需要访问每一个页面就要重新输入一次登录香信息。
向客户端计算机中设置cookie:
cookie的建立十分简单,只要用户的浏览器支持cookie功能,就可以使用PHP内建的setcookie()函数来建立一个cookie,cookie是http表头的一部分,因此setcookie()函数必须在其他细信息被输出到浏览器之前调用,所以即使是空行或者空格都不要在setcookie()函数之前输出,这和调用header()函数限制是类似的,setcookie函数的语法格式如下:
setcookie(name,value,expire,path,domain,secure)cookie 的名称指定为相同名称的变量。例如,如果被发送的 cookie 名为 "name",会自动创建名为 $user 的变量,包含 cookie 的值
参数 | 描述 |
---|---|
name | 必需。规定 cookie 的名称。 |
value | 必需。规定 cookie 的值。 |
expire | 可选。规定 cookie 的有效期。 |
path | 可选。规定 cookie 的服务器路径。 |
domain | 可选。规定 cookie 的域名。 |
secure | 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。 |
提示和注释
注释:可以通过 $HTTP_COOKIE_VARS["user"] 或 $_COOKIE["user"] 来访问名为 "user" 的 cookie 的值。
注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码。接收时会进行 URL 解码。如果你不需要这样,可以使用setrawcookie() 代替。
如果只有$name一个参数。,则原有的此名称的cookie选项将会被删除,也可以是有“”(空字符)来略过此参数,$expire和$secure是个整数,也可以使用0来省略此参数而不是使用空字符串,但$expire是一个正规的UNIX时间整数,有time()和mktime()函数传回,$secure指出cookie只有在安全的HTTPS连接时传送,在建立cookie的时候通常只设置前三个参数。<?php
//向客户端发送一个cookie 将isLogin的值设置为1 保存客户端一周的时间
setcookie('isLogin','1',time()+60*60*12*7);
如果其他的三个参数也要设置的话,可以按如下方式设置
setcookie("$username","helios","time()*60*60*24*7","/test",".example",1);
参数/test表示cookie只有在服务器的这个目录或者子目录中有效,参数.example.com使cookie能在example.com域名下的所有子域都有效,虽然“.”不是必须的 但是加上有很好的兼容性,当最后一的参数设置为1的时候表示只有早安全模式的时候才能被连接。
在PHP脚本中读取cookie的资料内容:、
当cookie设置成功的时候,客户端就拥有了cookie文件,用来保存web服务器为期设置用户信息。假如我们使用的是Windows浏览脚本,那么cookie文件就会保存到C:Documents and Settings\用户名\Cookies 文件夹下,直接打开是没有意义的二当用户再次访问网站的时候,浏览器会自动的把与该站点对应的cookie全部发送回服务器,从PHP5之后传送过来的信息都会保存到$_COOKIE全局数组中 所以每个PHP脚本都可以从该参数中获取相应的cookie信息。$_COOKIE全局数组储存所有通过HTTP传递的cookie资料内容,并以cookie的识别名称为索引值,内容值为元素 和$_POST 和$_GET用法差不多。
$_COKIE也是一个数组 支持遍历和标识名称访问
数组形态的cookie应用:
通过cookie标识名称中指定数组下标的形式设置
<?php
setcookie("user[username]","helios");
setcookie("user[password]","123654");
setcookie("user[email]","helios@qq.com");
在设置成功之后,如果需要在PHP脚本中获取其值同样是使用$_COOKI超级全局数组,但这是%_COOKIE就是一维数组了已经是二维的了,一维的下标是user 在下面的PHP脚本中我们使用foreach()函数遍历上面的COOKIE
//遍历$_COOKIE['user]数组
foreach($_COOKIE["user"] as $key=>$value){
//输出cookie数组中的二维键值对
echo $key . ":" .$value,"\n";
}
删除cookie:
有两种方法可以删除cookie和设置cookie的方法类似
第一种就是省略所有的参数表 仅导入第一个参数cookie识别参数变量
第二种方法把目标cookie设置为已过期
setcookie("username");
setcookie("username","",time()-1);
第一种方法把cookie的生存周期默认设置为空 则生存周期和浏览器是一样的 浏览器关闭时cookie也被删除
第二种是将有限期限参数设置为过期 这样系统就会自动删除客户端的cookie
setcookie("username");
setcookie("username","",time()-1);
基于cookie的用户登录模块:
下面这个例子将