第11章 Cookie与Session
(视频讲解:44分钟)
Cookie和Session是两种不同的存储机制,前者是从一个Web页到下一个页面的数据传递方法,存储在客户端;后者是让数据在页面中持续有效的方法,存储在服务器端。可以说,掌握Cookie和Session技术,对于Web网站页面间信息传递的安全性是必不可少的。
学习摘要:
Cookie概述
创建、读取、删除Cookie
Cookie应用案例
Session概述
创建、读取、删除Session
Session应用案例
当我们运行一个应用程序时(如QQ),会打开它,做些操作,然后关闭它。这很像一次会话。计算机清楚我们是谁,它知道我们何时启动应用程序,并在何时终止。但是在Internet上,存在一个问题:服务器不知道我们是谁以及我们做什么,这是因为HTTP地址不能维持状态。所以需要通过在服务器上存储用户信息以便后面使用,Cookie和Session解决了这个问题(如保存用户名称、购买商品等)。不过,会话信息是临时的,在用户离开网站后或会话过期后将被删除。如果需要永久储存信息,可以把数据存储在数据库中。下面就学习Cookie和Session的相关知识。
11.1 Cookie管理
视频讲解
Cookie是在HTTP下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie的使用很普遍,许多提供个人化服务的网站都是利用Cookie来区别不同用户,以显示与用户相应的内容,如Web接口的免费E-mail网站,就需要用到Cookie。有效地使用Cookie可以轻松完成很多复杂任务。下面对Cookie的相关知识进行详细介绍。
11.1.1 了解Cookie
1.什么是Cookie
Cookie是一种在远程浏览器端存储数据并以此来跟踪和识别用户的机制。简单地说,Cookie是Web服务器暂时存储在用户硬盘上的一个文本文件,并随后被Web浏览器读取。当用户再次访问Web网站时,网站通过读取Cookie文件记录这位访客的特定信息(如上次访问的位置、花费的时间、用户名和密码等),从而迅速做出响应,如在页面中不需要输入用户的ID和密码即可直接登录网站等。
举个简单的例子,如果用户的系统盘为C盘,操作系统为Windows 7,当使用IE浏览器访问Web网站时,Web服务器会生成相应的Cookie文本文件,并存储在用户硬盘的指定位置,如图11.1所示。
图11.1 Cookie文件的存储路径
说明
谷歌浏览器(Google Chrome)的Cookie数据位于C:\Users\Administrator\AppData\Local\Google\ Chrome\User Data\Default\Cookies。其中,Administrator是计算机用户名。在IE浏览器中,IE将各个站点的Cookie分别保存为一个XXX.txt这样的纯文本文件(文件个数可能很多,但文件都较小);而Firefox和Chrome是将所有的Cookie都保存在一个文件中(文件较大),该文件为SQLite3数据库格式的文件。
2.Cookie的功能
Web服务器可以应用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookie常用于以下3个方面。
记录访客的某些信息。如可以利用Cookie记录用户访问网页的次数,或者记录访客曾经输入过的信息,另外,某些网站可以使用Cookie自动记录访客上次登录的用户名。
在页面之间传递变量。浏览器并不会保存当前页面上的任何变量信息,当页面被关闭时,页面上的所有变量信息将随之消失。如果用户声明一个变量id=8,要把这个变量传递到另一个页面,可以把变量id以Cookie形式保存下来,然后在下一页通过读取该Cookie来获取变量的值。
将所查看的Internet页存储在Cookies临时文件夹中,可以提高以后浏览的速度。
注意
一般不要用Cookie保存数据集或其他大量数据。并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端计算机中,因此最好不要保存敏感的、未加密的数据,否则会影响网络的安全性。
11.1.2 创建Cookie
在PHP中通过setcookie()函数创建Cookie。在创建Cookie之前必须了解的是,Cookie是HTTP头标的组成部分,而头标必须在页面其他内容之前发送,它必须最先输出。若在setcookie()函数前输出一个HTML标记或echo语句,甚至一个空行都会导致程序出错。其语法格式如下:
setcookie()函数的参数说明如表11.1所示。
例如,使用setcookie()函数创建Cookie,代码如下:
表11.1 setcookie()函数的参数说明
在谷歌浏览器下运行本实例,按如下步骤查看Cookie。
首先右击浏览器页面,在弹出的如图11.2所示快捷菜单中选择“检查”命令。在弹出的对话框中单击Application后,在对话框左侧选择Storage→Cookies→http://localhost,即可看到Cookie内容,操作步骤如图11.3所示。
图11.2 选择“检查”命令
图11.3 查看Cookie
11.1.3 读取Cookie
在PHP中可以直接通过超级全局数组$_COOKIE[]来读取客户端的Cookie值。
例如,使用$_COOKIE[]读取Cookie变量,代码如下:
在上面的代码中,首先使用isset()函数检测Cookie文件是否存在,如果不存在,则使用setcookie()函数创建一个Cookie,并输出相应的字符串;如果Cookie文件存在,则使用setcookie()函数设置Cookie文件失效的时间,并输出用户上次访问网站的时间。最后在页面输出本次访问网站的当前时间。
首次运行本实例,由于没有检测到Cookie文件,运行结果如图11.4所示。如果用户在Cookie设置到期时间(本例为60秒)前刷新或再次访问该实例,运行结果如图11.5所示。
图11.4 第一次访问网页的运行结果
图11.5 刷新或再次访问本网页后的运行结果
注意
如果未设置Cookie的到期时间,则在关闭浏览器时自动删除Cookie数据。如果为Cookie设置了到期时间,浏览器将会记住Cookie数据,即使用户重启计算机,只要没到期,再访问网站时也会获得如图11.5所示的数据信息。
11.1.4 删除Cookie
当Cookie被创建后,如果没有设置它的失效时间,其Cookie文件会在关闭浏览器时被自动删除。如果要在关闭浏览器之前删除Cookie文件,方法有两种:一种是使用setcookie()函数删除,另一种是在浏览器中手动删除Cookie。下面分别进行介绍。
1.使用setcookie()函数删除Cookie
删除Cookie和创建Cookie的方式基本类似,删除Cookie也使用setcookie()函数。删除Cookie只需要将setcookie()函数中的第二个参数设置为空值,将第3个参数Cookie的过期时间设置为小于系统的当前时间即可。
例如,将Cookie的过期时间设置为当前时间减1秒,代码如下:
在上面的代码中,time()函数返回以秒表示的当前时间戳,把过期时间减1秒就会得到过去的时间,从而删除Cookie。
注意
把过期时间设置为0,可以直接删除Cookie。
2.在浏览器中手动删除Cookie
在使用Cookie时,Cookie自动生成一个文本文件存储在客户端计算机上。不同浏览器或者同一浏览器不同版本(如IE 6和IE 11)手动删除Cookie的方式都不相同。
11.1.5 Cookie的生命周期
如果Cookie不设定时间,就表示它的生命周期为浏览器会话的时间,只要关闭浏览器,Cookie就会自动消失。这种Cookie被称为会话Cookie,一般不保存在硬盘上,而是保存在内存中。
如果设置了过期时间,那么浏览器会把Cookie保存到硬盘中,再次打开浏览器时会依然有效,直到它的有效期超时。
虽然Cookie可以长期保存在客户端浏览器中,但也不是一成不变的。因为浏览器最多允许存储300个Cookie文件,而且每个Cookie文件支持最大容量为4KB;每个域名最多支持20个Cookie,如果达到限制时,浏览器会自动地随机删除Cookie。
11.1.6 7天免登录功能的实现
登录明日学院网站时,有一个“7天免登录”功能选项。当选择这个选项并登录成功后,7天之内浏览明日学院网站,就不需要再次登录,网站会为用户保留登录信息。下面就来实现这个功能。
【例11.01】 实现7天免登录功能。(实例位置:资源包\源码\11\11.01)
实现7天免登录功能的具体步骤如下。
(1)创建数据表。创建database11数据库,在该数据库中创建users数据表及数据。SQL语句如下:
创建完成后,如图11.6所示。
图11.6 新增users表及数据
(2)创建登录页。创建一个login.php文件,该文件中包含一个<form>表单,表单内有“用户名”“密码”“7天免登录”3个字段。login.php文件的具体代码如下:
上述代码中,使用checkbox复选框,设置属性为checked,即表示默认情况下是选中状态。如果用户选中“7天免登录”,则该复选框的value值为1,否则为空,运行效果如图11.7所示。
图11.7 登录页面
(3)检测是否登录成功。当用户在填写完“用户名”和“密码”后,单击“提交”按钮,将表单提交到checkLogin.php文件。在该文件中,处理业务逻辑。首先,以PDO方式连接数据库,然后在users表中查找用户名和密码。如果存在这条记录,则判断用户是否选中“7天免登录”。如果选中,则将用户名存入Cookie,保存7天,否则使用Cookie的默认保存时间。如果不存在这条记录,则直接提示“用户名和密码不匹配”。checkLogin.php文件的具体代码如下:
输入用户名mr,密码mrsoft,登录成功后,运行效果如图11.8所示。输入错误的用户名或密码登录时,运行效果如图11.9所示。
图11.8 登录成功
图11.9 登录失败
(4)自动登录。登录成功后,页面跳转到index.php文件。该文件中,判断$_COOKIE ['username']是否存在,如果存在,表示登录成功,显示该页面,否则跳转到登录页。如果选中“7天免登录”文选框,当关闭index.php页面后,再次访问该页面,会直接显示页面内容,而不需要重新登录。index. php文件的具体代码如下:
运行效果如图11.10所示。
图11.10 index.php页面效果
(5)退出登录。在index.php页面中单击“退出登录”按钮,页面跳转到logout.php文件。该文件中,使用setcookie()函数删除Cookie,并跳转到登录页面。此时,再次访问index.php页面,由于Cookie已经被删除,所以还会跳转到login.php登录页面。logout.php文件的代码如下:
11.2 Session管理
视频讲解
对比Cookie,Session文件中保存的数据是以变量的形式创建的,创建的会话变量在生命周期(24分钟)中可以被跨页的请求所引用。另外,Session是存储在服务器端的会话,相对安全,并且不像Cookie那样有存储长度的限制。
11.2.1 了解Session
1.什么是Session
Session译为“会话”,其本义是指有始有终的一系列动作/消息,如打电话时从拿起电话拨号到挂断电话这一系列过程可以称为一个Session。
在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统所经过的时间。因此,Session实际上是一个特定的时间概念。
2.Session工作原理
当启动一个Session会话时,会生成一个随机且唯一的session_id,也就是Session的文件名,此时session_id存储在服务器的内存中,当关闭页面时此id会自动注销,重新登录此页面,会再次生成一个随机且唯一的id。
3.Session的功能
Session在Web技术中非常重要。由于网页是一种无状态的连接程序,因此无法得知用户的浏览状态。通过Session则可记录用户的有关信息,以供用户再次以此身份对Web服务器提交要求时做确认。例如,在电子商务网站中,通过Session记录用户登录的信息,以及用户所购买的商品,如果没有Session,那么用户每进入一个页面都需要登录一次用户名和密码。
另外,Session会话适用于存储信息量比较少的情况。如果用户需要存储的信息量相对较少,并且对存储内容不需要长期存储,那么使用Session把信息存储到服务器端比较合适。
11.2.2 创建会话
创建一个会话需要通过以下步骤:
启动会话→存储会话→读取会话→删除会话。
1.启动会话
使用session_start()函数启动PHP会话。其语法格式如下:
注意
通常,session_start()函数在页面开始位置调用,会话变量将会被存储到$_SESSION中。
2.存储会话
开启会话之后,就可以使用$_SESSION变量来存取信息。我们要知道的是$_SESSION变量是个数组。当要把信息存入Session时,可编写如下代码:
例如,判断存储用户名的Session会话变量是否为空,如果不为空,则将该会话变量赋给$myvalue,代码如下:
3.读取会话
读取会话很简单,就像使用数组一样,代码如下:
4.删除会话
删除会话的方法主要有删除单个会话、删除多个会话和结束当前会话3种,下面分别进行介绍。
(1)删除单个会话
删除会话变量,同数组的操作一样,直接注销$_SESSION数组的某个元素即可。
例如,注销$_SESSION['user']变量,可以使用unset()函数,代码如下:
注意
使用unset()函数时,要注意$_SESSION数组中某元素不能省略,即不可以一次注销整个数组,这样会禁止整个会话的功能,如unset($_SESSION)函数会将全局变量$_SESSION销毁,而且没有办法将其恢复,用户也不能再注册$_SESSION变量。如果要删除多个或全部会话,可采用下面的两种方法。
(2)删除多个会话
如果想要一次注销所有的会话变量,可以将一个空的数组赋值给$_SESSION,代码如下:
(3)结束当前会话
如果整个会话已经结束,首先应该注销所有的会话变量,然后使用session_destroy()函数清除结束当前的会话,并清空会话中的所有资源,彻底销毁Session,代码如下:
11.2.3 使用Session实现判断用户登录功能
Cookie数据存储在客户的浏览器上,Session数据存储在服务器上;Cookie数据不安全,别人可以分享存放在本地的Cookie并进行Cookie欺骗,考虑到安全性应当使用Session。
【例11.02】 使用Session实现判断用户是否登录。(实例位置:资源包\源码\11\11.02)
本实例通过Session技术实现如何判断用户是否登录。具体开发步骤如下。
(1)创建login.php文件作为登录页面,该页面与例11.01登录页面相似。关键代码如下:
运行效果如图11.11所示。
图11.11 登录页面
(2)单击“提交”按钮,表单提交到checkLogin.php文件。在该文件中处理登录逻辑。登录成功后,使用session_start()函数初始化$_SESSION变量,将username存储到Session中。关键代码如下:
运行效果如例11.01中图11.8和图11.9所示。
(3)登录成功后,username存储在Session中,可以使用$_SESSION['username']获取到该值。在index.php中,关键代码如下:
运行效果与例11.01相同。
(4)退出登录。创建logout.php文件,使用unset()函数清除Session。代码如下:
清除Session后,再次访问index.php文件,页面将跳转到登录页。
注意
使用Session前,一定要先开启session_start(),否则提示“$_SESSION不存在”。
11.3 小结
本章主要介绍了Cookie和Session的基础知识,包括它们的创建、读取以及删除,并且重点介绍了它们的一些高级应用。通过完整的实例,使读者加深对Cookie和Session的理解及运用。希望通过本章的学习,读者能够了解Cookie和Session的关系和区别,以及它们各自的应用场景。
11.4 实战
11.4.1 实现聊天室换肤的功能
实例位置:资源包\源码\11\实战\01
应用Session可以在页面传递数据的特性,实现聊天室换肤的功能。单击不同的颜色值,更换聊天室的背景颜色。运行效果如图11.12所示。
图11.12 更换聊天室背景颜色
11.4.2 实现加入购物车的功能
实例位置:资源包\源码\11\实战\02
模拟京东商城购物车,创建一个goods商品表和一个order订单表,使用Session,实现用户在未登录情况下,加入购物车的功能,如图11.13所示。
图11.13 加入购物车