会话控制是一种面向连接的可靠通信方式,通常根据会话控制记录判断用户登录的行为。比如:网购和处理邮件时,你可能需要访问多个页面,但只要你不退出,在同一个系统上,多个页面之间互相切换时,还能保持用户的登录信息。

但是http是无状态的协议,不能维护两个事物之间的状态。但一个用户在请求一个页面以后再请求另外一个页面时,还要让服务器知道这是同一个用户。可以使用cookie和session解决这个问题。

cookies(小甜饼的意思)是一种由服务器发送给客户端的片段信息,存储在客户端浏览器的内存或硬盘上,在客户对该服务的请求中发回它。

格式和描述:

bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])
 

setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including <html> and <head> tags as well as any whitespace. If output exists prior to calling this function, setcookie() will fail and return FALSE. If setcookie() successfully runs, it will return TRUE. This does not indicate whether the user accepted the cookie.

 

setcookie()函数的参数说明
参数 描述 示例
$name cookie的识别名称  
$value cookie的值  
$expire cookie的生存期限  
$path cookie在服务器端生效的路径  
$domain cookie所属服务器域名  
$secure 设置cookie是否仅通过https连接  

一个简单的登录系统:

<?php
   
    if(isset($_GET["out"])){
        setcookie('id','');/*删除cookie,即把其值设为空*/
        setcookie('pass','');
        echo "<script>location.href='Untitled 5.php'</script>";
    }
   
    if(isset($_POST["name"])&&isset($_POST["password"])){
        setcookie('id',$_POST["name"],time()+3600);
        setcookie('pass',$_POST["password"],time()+3600);
        echo "<script>location.href='Untitled 5.php'</script>";
    }
   
    if(isset($_COOKIE['id'])&&$_COOKIE['pass']){
        echo "登陆成功<br />用户名:".$_COOKIE['id']."<br>密码:".$_COOKIE['pass'];   
       
        echo "<br><a href='Untitled 5.php?out=out'>退出</a>";
    }
?>

<form action="" method="post">
    用户:
    <input type="text" name="name" /><br /><br />
    密码:
    <input type="password" name="password" /><br /><br />
    <input type='submit' value="登陆" />
</form>
 

 

session

session的意思是会话,session和cookie都是用来存储用户的相关资料,不同之处是session将数据存储在服务器端。

    客户端仅需要保存由服务器为用户创建的一个session标识符,称为sessionID;而在服务器端保存session变量的值。SessionID是一个不会重复,又不容易被找到规律的,由32为十六进制数组成的字符串。如果用户阻止cookie的使用,则可以将sessionid保存在用户浏览器地址栏的URL中。

    当某个用户想web服务器发出请求时,服务器首先会检查这个客户端的请求里是否已经包含了一个sessionID。如果包含,说明之前已经为此用户创建过sessionID,服务器则按该sessionID,把session检索出来使用。如果不含,则为该用户创建一个session,并且生成一个与此session相关的sessionID,在本次响应中被传送给客户端保存。

为了避免对服务器的过大消耗,session会因为下面两种情况而自然消失:

一、用户关闭浏览器。

二、session指定的有效期限到期。一般PHP系统中对于session的生存时间并无定义,默认为0.可以通过修改php.ini配置文件中有关"session.cookie.lift_time"项目,来设定有效期,以秒为单位指定了发送到浏览器cookiecookie的生命周期。

 

和cookie不同,session使用前,必须先调用session_start()函数,以便让PHP核心程序,将和session相关的内建环境变量预先载入内存。

可使用session_destroy()函数销毁整个session

将上面的使用cookie的登录系统修改为使用session:

<?php
    session_start();
    if(isset($_GET["out"])){
        unset($_SESSION['id']);/*删除session中的单个变量*/
        unset($_SESSION['pass']);
    }
   
    if(isset($_POST["name"])&&isset($_POST["password"])){
        $_SESSION['id']=$_POST["name"];
        $_SESSION['pass']=$_POST["password"];
    }
   
    if(isset($_SESSION['id'])&&$_SESSION['pass']){
        echo "登陆成功<br />用户名:".$_SESSION['id']."<br>密码:".$_SESSION['pass'];   
       
        echo "<br><a href='Untitled 5.php?out=out'>退出</a>";
    }
?>

<form action="" method="post">
    用户:
    <input type="text" name="name" /><br /><br />
    密码:
    <input type="password" name="password" /><br /><br />
    <input type='submit' value="登陆" />
</form>