16.PHP会话控制

会话技术

  • “HTTP协议”是无状态协议
    HTTP协议不能告诉我们多请求是否是来自同一个人。

  • 会话控制
    会话控制的思想就是允许服务器跟踪同一个客户端做出的连续请求。

会话跟踪的方式

HTTP是无状态的协议,所以不能维护两个事物间的状态。但一个用户在请求一个页面以后再请求另一个页面时,需要让服务期知道这是一个用户。总共有3种数据传递方式。

  1. 超链接或者header()函数等重定向方式
  2. 使用Cookie将用户的信息状态,存放在客户端的计算机中。
  3. 使用Session将用户的信息状态,存放在服务器之中。

Cookie应用

Cookie概述

cookie是在http协议下,服务器或脚本可以维护客户端信息的一种方式。

Cookie是一种由服务器发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘上。常用于保存用户名,密码,个性化设置,个人偏好记录等。当用户访问服务器时,服务器可以设置和访问cookie的信息。

cookie保存在客户端,通常是IE或Firefox浏览器的cookie临时文件夹中,可以手动删除。注意:如果浏览器上cookie太多,超过了系统所允许范围,浏览器也会自动对它进行删除。

设置Cookie

设置Cookie 语法:

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

本cookie函数可以有6个属性,常用的有3个参数。

例如

//向客户端发送一个Cookie,将变量username值为skygao,保存客户端一周的时间 
setcookie("username", "skygao", time()+60*60*24*7); 
//使用setCookie()函数的全部参数设置 
setcookie("username", "skygao", time()+60*60*24*7, "/test", ".example.com", 1); 
参数 描述 示例
name 名字 调用名为cookiename的cookie
value 假设第一个参为cookiename,通过$_COOKIE[‘name’取得值]
exprice 有效时间 设置cookie的过期时间和日期,用一个标准的Unix时间标记,可以用time()函数取得,以秒为单位.
path 范围 服务器端的有效路径,设置为“/”表示这个域中所有数组都可以被访问读取。
domain 域名 设定cookie有效域名
secure 指明cookie只能通过安全的https传送 设为true时只能使用安全的https,默认为false,即设置是否仅在https安全连接时才发送cookie到客户端,0或1。
读取Cookie

如果Cookie设置成功,客户端就拥有了Cookie文件,用来保存Web服务器为其设置的用户信息。
在PHP中读取Cookie信息很简单,使用超全局数组$_COOKIE[‘cookie名’]即可获取cookie中的内容。

数组形态的Cookie应用

数组也可以利用多维数组的形式,将多个内容值存储在相同Cookie名称标识符下。

<?php 
  setcookie("user[username]", "skygao");            //$_COOKIE["user"]["username"] 
  setcookie("user[password]", md5("123456"));   //$_COOKIE["user"]["password"] 
  setcookie("user[email]", "skyga@lampbrother.net");//$_COOKIE["user"]["email"] 

   //遍历$_COOKIE[“user”]数组
   foreach($_COOKIE["user"] as $key => $value){ 
      //输出Cookie数组中二维的键值对 
      echo $key.":".$value."\n";
   }

删除Cookie

有2种方式删除Cookie

  1. 省略setcookie()函数的所有参数列
  2. 设置cookie为已过期
<?php 
       //只指定Cookie识别名称一个参数,即删除客户端中这个指定名称的Cookie资料   
       setCookie("account");                     //第一种方法 

       //设置Cookie 在当前时间过期,因此系统会自动删除识别名称为isLogin的Cookie 
       setCookie("isLogin", "" , time()-1);  //第二种方法 
基于Cookie的用户登录模块

html页面

<html>
     <head>
           <title>用户登录</title>
     </head>
     <body>
           <h2>用户登录</h2>
           <form action="login.php?action=login" method="post">
            用户名 <input type="text" name="username" /> <br>
            密    码 
             <input type="password" name="password" /><br>
             <input type="submit" value="登录" /> 
            </form>
     </body>
</html>

php页面

/* 声明一个删除Cookie的函数,调用时清除在客户端设置的所有Cookie */
 function clearCookies() { 
        setCookie('username', '', time()-3600); //删除Cookie中的标识符为username的变量 
        setCookie('isLogin', '', time()-3600); //删除Cookie中的标识符为isLogin的变量 
  } 
 /* 判断用户是否执行的是登录操作 */
  if($_GET["action"]=="login") { 
        /* 调用时清除在客户端先前设置的所有Cookie */
        clearCookies(); 
        /* 检查用户是否为admin,并且密码是否等于123456 */ 
        if($_POST["username"]=="admin" && $_POST["password"]=="123456") { 
             /* 向Cookie中设置标识符为username,值是表单中提交的,期限为一周 */ 
             setCookie('username', $_POST["username"], time()+60*60*24*7); 
             /* 向Cookie中设置标识符为isLogin,用来在其他页面检查用户是否登录 */ 
             setCookie('isLogin', '1', time()+60*60*24*7); 
             /* 如果Cookie设置成功则转向网站首页 */ 
             header("Location:index.php"); 
        }else{ 
             die("用户名或密码错误!"); } /* 判断用户是否执行的是退出操作 */ 
  }else if($_GET["action"]=="logout"){ 
        clearCookies(); /* 退出时清除在客户端设置的所有Cookie */ 
  }

判断页面

<?php
      /* 如果用户没有通过身份验证,页面跳转至登录页面 */        
      if(!(isset($_COOKIE['isLogin']) && $_COOKIE['isLogin'] == '1')) { 
          header("Location:login.php"); exit; 
      } 
?> 
<html>
    <head>
         <title>网站主页面</title>
    </head>
    <body> 
         <?php /* 从Cookie中获取用户名username */ 
                echo '您好:'.$_COOKIE["username"];
          ?> 
         <a href="login.php?action=logout">退出</a> 
         <p>这里显示网页的主体内容</p> 
     </body>
</html>

Session的应用

Session概述

Session和Cookie相似,都是用来储存使用者的相关资料。但最大的不同之处在于Cookie是将数据存放在客户端的计算机之中,而Session则是将数据存放于服务器系统之下。

cookie和session在php中的使用区别:

cookie和session都可以暂时保存在多个页面中使用的变量,但是它们有本质的差别。
cookie存放在客户端浏览器中,
session保存在服务器上。
它们之间的联系是session ID 一般保存在cookie中,或者放在URL上。

禁用cookie的方法:
点击IE中的“工具”—“Internet选项”,在弹出的对话框里点击“安全”—“自定义级别”项,将“允许每个对话COOKIE”设为禁用.

配置Session

php.ini文件和Session有关的几个常用配置选项

  • session.auto_start = 0 ; 在请求启动时初始化session

  • session.cache_expire = 180 ; 设置缓存中的会话文档在 n 分钟后过时

  • session.cookie_lifetime = 0 ; 设置按秒记的cookie的保存时间, 相当于设置Session的过期时间,为0时表示直到浏览器被重启

  • session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。但启用该选项也有一些限制,如果确实启用了session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。

  • session.cookie_path = / ; cookie的有效路径

  • session.cookie_domain = ; cookie的有效域

  • session.name = PHPSESSID; 用在cookie里的session的名字

  • session.save_handler = files ; 用于保存/取回数据的控制方式
    session.save_path = /tmp ; 在 save_handler 设为文件时传给控制器的参数, 这是数据文件将保存的路径.

  • session.use_cookies = 1 ; 是否使用cookies

Session的声明与使用

Session的设置不同于Cookie,必须先启动,在PHP中必须调用session_start()。session_start()函数的语法格式如下

Bool session_start(void)

注意:session_start()函数之前不能有任何输出

Session以数组的形式使用
如:$_SESSION[‘session名’]

session_start(); //启动Session 的初始化 
$_SESSION["username"] = "skygao"; //注册Session 变量,赋值为一用户名称
$_SESSION["uid"] = 1; //注册Session 变量,赋值为一个用户的ID 
注册一个会话变量和读取Session

在PHP中使用Session变量,除了要启动之外,还要经过注册的过程。注册和读取Session变量,都要通过访问$_SESSION数组完成。
在$_SESSION关联数组中的键名具有和PHP中普通变量相同的命名规则。

Session变量会被保存在服务器端的某个文件中,该文件的位置是通过php.ini文件,在session.save_path属性指定的目录下。

注销变量与销毁Session
  1. bool session_destroy(void)
    删除服务器端保留session信息的文件

  2. unset($_SESSION[‘键名’])
    删除内存中由Session数组保存的变量
    清除所有变量可以使用 $_SESSION=array()

  3. 如果session是基于Cookie的,那么我们还需要删除客户端保留的cookie文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容