PHP快速入门之会话控制

11.1案例介绍

登录


11.2分析案例

用户登录时为避免每一个链接都验证用户信息,所以使用会话控制技术,来记录用户的登录状态

11.3核心知识

会话控制概述、cookie工作原理及使用方法、session工作原理及使用方法

11.4知识讲解

11.4.1会话控制概述

当静态网站发展到动态网站时,我们需要面对维护某种状态,逐渐的出现了会话控制。

http是一个无状态的协议,此协议无法来维护两个事务之间的联系。

如何理解HTTP协议本身是无状态的?

我们上网都要靠HTTP协议传递信息。比如我们在浏览器里键入:http://www.bokee.com/这个网址并回车,你会发现网址会变成:http://www.bokee.com/,其原因就是浏览的网页是基于http协议的。http协议无法记录用户经常上哪些网站,有什么爱好,也无法记录用户的ID帐号和密码。这就是所谓的HTTP协议无状态。HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样,你认得它们,它们则肯定认不得你。

当一个用户在请求一个页面后在请求另外一个页面时,http将无法告诉我们这两个请求是来自同一个变量。

会话控制思想就是能够在网站中跟踪一个变量,我们可以跟踪变量,就可以做到对用户的支持,并根据授权和用户身份显示不同内容,不同页面。

Cookie和 session有什么用?

常见的用法,比如在有些网站下载东西需要会员先登陆。http协议本身是无状态的,无法得知顾客是否已经登陆,怎么办呢?cookie和session就可以知道。再比如网上购物,购物车怎么知道顾客挑选过哪些商品呢?cookie和session也可以记录。总而言之,cookie和session就是能够记录顾客状态的技术,尽管二者属于不同的技术,但只要cookie能做到的,session也能做到!

11.4.2基本会话功能

php的会话是通过会话ID来实现, 用户在每次登陆的过程中,得到会话ID是唯一的,它可以保存在用户的机器里,或者通过URL在网络上传输。

会话ID像一把钥匙,他允许我们注册特定的变量,我们称为会话变量。

这些变量的内容保存在服务器端,而会话ID就是客户端唯一可见的信息,如果在网络连接中,客户端通过COOKIE或URL确定了会话的ID,那么就可以访问,会话保存在服务器上的会话变量。

11.4.3 Cookie和Session在php中的使用

cookie和session都可以暂时保存在多个页面中使用的变量。但是它们有本质的差别。

cookie存放在客户端浏览器中,session保存在服务器上。它们之间的联系是session ID 一般保存在cookie中.

在WEB技术发展史上,Cookie技术的出现是一个重大的变革。

最先是Netscape在它的Netscape Navigator浏览器中引入了Cookie 技术,从那时起,World Wide Web 协会就开始支持Cookie标准。以后又经过微软的大力推广,即在微软的 Internet Explorer 浏览器中完全支持Cookie技术。到现在,绝大多数的浏览器都支持Cookie技术,或者至少兼容Cookie技术的使用。

11.4.4 Cookie

1. 什么是Cookie?

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

cookie是web服务器保存在用户浏览器上的小甜饼(文件),她可以包含有关用户的信息。当用户访问服务器时,服务器可以访问到cookie的信息

如果浏览器上Cookie太多,超过了系统所允许的范围,浏览器将自动对它进行删除。

2. Cookie工作原理

当客户访问某个基于PHP技术的网站时,在PHP中可以使用setcookie函数生成一个cookie,系统经处理把这个cookie发送到客户端并保存在C:\Documents and Settings\用户名\Cookies目录下。cookie是 HTTP标头的一部分, 因此setcookie函数必须在任何内容送到浏览器之前调用。这种限制与header()函数一样(如需了解head()函数,请自行查阅)。当客户再次访问该网站时,浏览器会自动把C:\Documents and Settings\用户名\Cookies目录下与该站点对应的cookie发送到服务器,服务器则把从客户端传来的cookie将自动地转化成一个PHP变量。在PHP5中,客户端发来的cookie将被转换成全局变量。你可以通过$_COOKIE[‘xxx’]读取。

3. 设置Cookie

PHP用setcookie函数来设置Cookie。Cookie 在传输过程中,是HTTP 协议头的一部分,用于浏览器和服务器之间传递信息,所以必须在任何属于HTML文件本身的内容输出之前调用SetCookie函数,调用该函数前即使有空格、空白行都不行

setcookie函数定义了一个cookie并且把它附加在http头中:

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

常用参数解释:

name参数是设置cookie的名字.

value设定了cookie的值.

expire参数是一个标准的Unix时间标记,可以用time()函数取得,以秒为单位:

可选参数path, domain,secure

path :服务器端的有效路径

domain :设定有效域名

secure :设置是否仅在https安全连接时才设定

注意:

如果网站有几个不同的文件目录,使用不带路径的cookie,那么在一个页面里设置的cookie在另一个页面里会看不到.如果没有指定路径,web服务器自动把设置时的路径作为指定的路径。

解决办法:设定路径和域名比如: www.php.net

实例: $value="the best way is by yourself";

setcookie("cookiename",$value,time()+60*60*24*7);

接收和处理cookie

PHP对cookie有很好的支持,和form表单一样,在接收的时候PHP会自动从web服务器接收HTTP头并且分析它。接收的时候和表单接收一样,用联COOKIE[ ]或者$_HTTP_COOKIE_VARS[ ]接收。

cookie的生命周期到了,cookie就会失效

设置一个cookie时失效时间为time( )那么在页面浏览完之后就被删除

4. 使用Cookie的限制

首先:在html文件的内容输出前设置:

不同的浏览器版本,浏览器型号对cookie的处理不同

客户端可以禁用cookie,浏览器也会限制cookie的数量

5. 创建Cookie数组

其一: SetCookie("CookieArray[]", "Value 1"); SetCookie("CookieArray[]", "Value 2"); 其二: SetCookie("CookieArray[0]", "Value 1"); SetCookie("CookieArray[1]", "Value 2");

setcookie()中使用数组的例子:

<?php      setcookie("cookie[three]", "cookiethree");      setcookie("cookie[two]", "cookietwo");      setcookie("cookie[one]", "cookieone");//刷新页面后,显示出来      if (isset($_COOKIE['cookie'])) {           foreach ($_COOKIE['cookie'] as $name => $value) {                echo "$name : $value <br />\n";}      } //help from php_help ?>

6. 删除Cookie

要删除一个已经存在的Cookie,有两个办法: 1、调用只带有name参数的SetCookie,那么名为这个name的Cookie将被从关系户机上删掉;setcookie(“MyCookie”); //删除MyCookie。

2、设置Cookie的失效时间为time()或time()-1//time()减多少没有关系啦,只要是过期时间就行//,那么这个Cookie在这个页面的浏览完之后就被删除了(其实是失效了)。

例如:setcookie(“MyCookie”,”Value”,time()-1); //删除MyCookie。要注意的是,当一个Cookie被删除时,它的值在当前页在仍然有效的。如果要把cookie保存为浏览器进程,即浏览器关闭后就失效。那么可以直接把expiretime设为0。例如:setcookie(“name”,”value”,0)。该参数不设置的话,关闭浏览器也能结束一个cookie。

7. Cookie注意事项

1、SetCookie()之前不能有任何html输出,就是空格,空白行都不行。

2、SetCookie()后,你在当前页调用echo $_COOKIE[“name”]不会有输出。必须刷新或到下一个页面才可以看到Cookie值。

3、使用Cookie的限制。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个。

4、Cookie是保存在客户端的,用户禁用了Cookie,你的Cookie自然也就没作用啦!

11.4.5 Session

1. 什么是Session

session在web开发中具有非常重要的份量。它可以将用户正确登录后的信息记录到服务器的内存中,当用户以此身份访问网站的管理后台时,无需再次登录即可得到身份确认。而没有正确登录的用户则不分配session空间,即便输入了管理后台的访问地址也不能看到页面内容。通过session确定了用户对页面的操作权限。

2. Session的原理

当用户向服务器端发送了一个开启了session的url请求,服务器会因为该请求开启了session,而为这次请求随机分配一个sessionid。同时服务器端的指定路径下,会记录该sessionid,以及该用户的登录信息(例如用户名和密码)。同时会将这个sessionid传回发送请求的客户端,而这个sessionid会被保存在客户端一个生命周期为0的cookie中。因此session的正常使用要依赖于cookie的开启。

因为cookie是通过客户端浏览器来保存的,在ie浏览器中,如果浏览器的隐私设置为阻止所有cookie,那么cookie则被禁用,而session也不能正常使用。如果想让session正常发挥作用,浏览器隐私需要设置为高或者以下。

3. Session的使用步骤

1). 启动session:使用session_start()函数来启动。

2). 注册会话:直接给$_SESSION数组添加元素即可。

3). 使用会话:判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即可。

4). 删除会话:

A. 可以使用unset删除单个session;

B. 使用$_SESSION=array()的方式,一次注销所有的会话变量;

C. 使用session_destroy()函数来彻底销毁session。

4. 对删除会话的三种方式比较

A. unset可以将session值从session文件中清除,但是该session文件依然存在;在同一个页面,unset一个session值后,立刻输出该session值,无法获得内容。

B. $_SESSION=array()的方式也是将session值从session文件中清除,但是该session文件依然存在;在同一个页面,通过$_SESSION=array()删除所有session后,立刻输出session值,无法获得内容。

C. session_destroy()可以将session的保存文件进行删除。在同一个页面,session_destroy()销毁session后,立刻输出该session值,还依然可以输出session的内容,当刷新后则无法获得内容。

因此,为了彻底清除session,一般先$_SESSION=array(),然后再session_destroy()。

5. Session的综合应用

当用户登录成功后,必须应用Session技术来跟踪登录信息。此外需要同时将验证码图片生成进行复习。因为验证码图片生成过程中利用到了Session技术的跨页面传值的特性。

11.4.6 Session和Cookie的区别

cookie是保存在客户端机器的,对于未设置过期时间的cookie,cookie值会保存在机器的内存中,只要关闭浏览器则cookie自动消失。如果设置了cookie的过期时间,那么浏览器会把cookie以文本文件的形式保存到硬盘中,当再次打开浏览器时cookie值依然有效。

session是把用户需要存储的信息保存在服务器端。每个用户的session信息就像是键值对一样存储在服务器端,其中的键就是sessionid,而值就是用户需要存储信息。服务器就是通过sessionid来区分存储的session信息是哪个用户的。

Session和Cookie两者最大的区别就是session存储在服务器端,而cookie是在客户端。session安全性更高,而cookie安全性弱。

11.5知识运用

根据本讲单元讲述的内容,做出一个标准的用户注册登录的模块。包括标准的注册表单书写、表单信息入库。当注册成功后,可以通过登录界面进入到会员管理中心。如果是首次注册成功,那么默认同时让该用户进入会员中心。因为这个涉及到我们下个月所学内容,所以本单元侧重于用户登录模块,而登录成功后只需要先应用session技术,然后进入到一个模拟会员中心的页面即可。

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