会话控制
Posted Irving_yx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了会话控制相关的知识,希望对你有一定的参考价值。
在浏览网站时,访问Web页面都需要HTTP协议实现。而HTTP协议是无状态协议,也就是说HTTP协议没有一个内建机制类维护两个事物之间的状态。
会话控制的思想:就是允许服务器跟踪一个客户端作出连续请求。
会话控制:是一种面向连接的可靠的通信方式,通常根据会话控制记录判断用户登录的行为。
会话跟踪方式,php系统提供三种网页之间传递数据的方式:
1)使用超链接或者header()函数等重定向的方式。通过在URL的GET请求中附加参数的形式,将数据从一个页面转向另一个PHP脚本中。也可以使用隐藏表单来存储使用者资料,并将这些信息在提交表单时传递给服务器PHP脚本
2)使用Cookie将用户的状态信息存放在客户端的计算机中,让其他程序通过存取客户端计算机的Cookie,来存取目前的使用者资料
3)相对于Cookie还可以使用Session,将访问者的状态信息存放于服务器之中,让其他程序能透过服务器中的文件或者数据库,来存取使用者资料
注:在三种页面传值方式中,URL的GET和HTTP POST方式,主要用来处理参数的传递或是多笔资料的输入,适合于两个脚本之间的简单数据传递。而我们进行会话跟踪一般使用Cookie和Session技术。
Cookie
Cookie是一种由服务器发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘上,在客户对该服务器的请求中回发它。
1.向客户机设置Cookie
Cookie的建立十分简单,只要用户浏览器支持Cookie功能,就可以使用PHP内建函数setcookie()函数来建立一个Cookie。Cookie是HTTP标头的一部分,因此setcookie()函数必须在其他信息被输出前调用。
代码:
1 //向客户端发送一个Cookie,将变量username赋值为fly,保存客户端一周的时间 2 setcookie("username","fly",time()+60*60*24*7); 3 4 //使用setcookie()函数的全部参数 5 //“/test”表示cookie只在服务器的这个目录或者子目录有效 6 //“.example.com”使cookie能在该域名下所有子域有效 7 // 1 最后一个参数为1表示cookie仅在安全的连接中才能被设置 8 setcookie("username","fly",time()+60*60*24*7,"/test",".example.com",1);
2.读取Cookie的资料内容
如果Cookie设置成功,客户端就拥有了Cookie文件,用来保存Web服务器为其设置的用户信息。当客户再次访问该网站时,浏览器会自动把与该站点对应的Cookie信息全部发回height服务器。PHP5以后,任何客户端发过来的Cookie信息都自动保存在$_COOKIE全局数组中。
在设置Cookie的脚本中,第一次读取它的信息并不会生效,必须刷新或到下一页面才能看到Cookie值。因为Cookie要先被设置到客户端,再次访问才能被发送回来,这时才能获取。
3.删除Cookie
删除Cookie有两种方法: a.省略setcookie()函数的所有参数列,仅导入第一个参数——Cookie识别名称参数,来删除指定名称的Cookie资料;
b.利用setcookie()函数把目标Cookie设定为“已过期”状态
代码:
1 //只设定第一个参数 2 setcookie("username"); 3 4 //将目标Cookie设定为已过期状态 5 setcookie("username","",time()-1);
实例:基于Cookie的用户登录模块
login.php
1 <?php 2 //声明一个删除Cookie的函数,调用时清除在客户端设置的所有Cookie 3 function clearCookies(){ 4 setcookie(‘username‘,‘‘,time()-1); 5 setcookie(‘islogin‘,‘‘,time()-1); 6 } 7 //判断用户是否执行登录操作 8 if($_GET[‘action‘]==‘login‘){ 9 10 clearCookies(); 11 12 if($_POST[‘username‘]=="admin" && $_POST["password"]=="123456"){ 13 setcookie("username",$_POST[‘username‘],time()+3600*24*7); 14 setcookie("islogin",1,time()+3600*24*7); 15 header("location:index.php"); 16 }else{ 17 die("密码错误!"); 18 } 19 }else if($_GET[‘action‘]=="logout"){ 20 clearCookies(); //退出登录清空Cookie 21 } 22 ?> 23 <html> 24 <head><title>用户登录</title></head> 25 <body> 26 <h2>用户登录</h2> 27 <form action=‘login.php?action=login‘ method=‘post‘> 28 用户名:<input type=‘text‘ name=‘username‘/><br> 29 密 码:<input type=‘password‘ name=‘password‘/><br> 30 <input type=‘submit‘ value=‘登录‘/> 31 </form> 32 </body> 33 </html>
index.php
1 <?php 2 if(!(isset($_COOKIE[‘islogin‘]) && $_COOKIE[‘islogin‘]==‘1‘)){ 3 header("location:login.php"); 4 exit; 5 } 6 ?> 7 <html> 8 <head><title>网站主页</title></head> 9 <body> 10 <?php 11 echo "您好:".$_COOKIE[‘username‘]; 12 ?> 13 <a href=‘login.php?action=logout‘>退出</a> 14 <p>这里是网站的内容</p> 15 </body> 16 </html>
Session
Session技术与Cookie相似,都是用来存储使用者的相关资料。但最大的不同在于Cookie将数据存放于客户机中,而Session将数据存放在服务器系统之下。
Session在客户端仅需保存由服务器为用户创建的一个Session标识符SessionID,而在服务器端(文件/数据库/MenCache中)保存Session变量的值。SessionID是一个既不会重复又不容易被找到规律的、由32位十六进制数组成的字符串。SessionID会保存在客户端的Cookie里,如果用户阻止Cookie的使用,则可以将SessionID保存在用户浏览器地址栏的URL中。当用户请求Web服务器时,就会把SessionID发送给服务器,再通过SessionID提取保存在服务器中的Session变量。
1.配置Session
session.auto_start 在客户访问任何页面时都自动开启并初始化Session,默认禁止。
session.cookie_domain 传递会话ID的Cookie作用域(默认为空时根据Cookie规范自动生成主机名)
session.cookie_lifetime Cookie中的SessionID在客户机上保存的有效期(秒),0表示延续到浏览器关闭时
session.cookie_path 传递会话ID的Cookie作用路径
session.name 会话的名称,用在客户端的Cookie里的会话ID标示名,只能包含字母和数字
session.save_path 对于files处理器,此值是创建会话数据文件的路径
session.use_cookies 是否使用Cookie在客户端保存会话ID,1标示允许
session.use_trans_sid 是否使用明码在URL中显示SID,默认禁止
session.gc_probability、session.gc_divisor 定义在每次初始化会话时,启动垃圾回收程序的概率,会话越频繁,概率越小,建议1/(1000-5000)
session.gc_maxlifetime 超过此参数所指的秒数后,保存的数据将被视为“垃圾”并由垃圾回收程序清除
session.save_handler 存储和检索与会话关联的数据的处理器名字,默认files
2.Session的声明与使用
Session的设置不同于Cookie,必须先启动,在PHP中必须调用Session_start()函数,该函数没有参数,返回值均为true。主要两个作用:一个是开始会话,二是返回已存在的会话。
Session机制:当第一次访问网站时,Session_start()函数就会创建一个唯一的SessionID,并自动通过HTTP的响应头将这个SessionID保存到客户端的Cookie中。同时,也在服务器创建一个以这个SessionID命名的文件,用于保存这个用户的会话信息。当一个用户再次访问这个网站时,也会通过HTTP的请求头将客户端Cookie中保存的SessionID再携带过来,这时session_start()函数就不会再分配一个新的SessionID,而是在服务器硬盘中寻找SessionID同名的Session文件,将之前保存的用户信息读出,达到跟踪这个用户的目的。
注:基于Cookie的Session,在使用该函数session_start()开启Session之前,不能有任何输出的内容。如果不想在每个脚本都使用Session_start()来开启Session,可以在php.ini中设置session.auto_start=1
代码:
1 //启动Session的初始化 2 session_start(); 3 //注册Session变量 4 $_SESSION[‘username‘]=‘fly‘;
2.注销变量与销毁Session
当使用完一个Session变量后,可以将它删除;当完成一个会话后,也可以将其销毁。调用session_destroy()函数结束当前会话,并清空会话中的所有资源。
代码:
1 //开启session并初始化 2 session_start(); 3 //删除所有Session变量,也可以用unseat($_SESSION[‘XXXX‘])逐个删除 4 $SESSION=array(); 5 //如果基于Cookie的Session,使用setCookie()删除包含SessionID的Cookie 6 if(isset($_COOKIE[session_name()])){ 7 setcookie(session_name(),"",time()-1,‘/‘); 8 } 9 //销毁Session 10 session_destroy();
注:使用$SESSION=array();清空$_SESSION数组的同时,也将这个用户在服务器端对应的Session文件内容清空。而使用session_destroy()函数时,则是将这个用户在服务器端对应的Session文件删除。
Session的自动回收机制
对于在页面点击退出按钮,单击销毁本次会话。会将Session文件删除,但是当意外断网或者用户之间关闭页面,服务器端Session文件是不会被删除的,这些文件成为“垃圾”。下次登录又会分配一个新的SessionID重新登录。“垃圾回收程序”启动后根据Session文件的修改时间将所有过期的Session文件全部删除,通过Session_maxlifetime选项来指定一个时间。
以上是关于会话控制的主要内容,如果未能解决你的问题,请参考以下文章