会话控制

在浏览网站时,访问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选项来指定一个时间。

原文地址:https://www.cnblogs.com/yexiang520/p/5579241.html