




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PHP和MySQLWeb开发授课教师:职务:第8章会话处理
课程描述在Web应用程序中,会话是客户端用户与服务器之间交换数据的过程。通过会话可以实现页面之间的参数传递。本章将介绍PHP会话处理中使用的Cookie、URL重写和Session等技术。本章知识点8.1什么是会话处理8.2Cookie的应用8.3Session的应用8.1什么是会话处理8.1.1问题的提出8.1.2解决方案8.1.1问题的提出在第1章中已经介绍过超文本传输协议(HTTP),它定义了通过互联网传输数据的规则。HTTP是一种无状态的协议,也就是每次请求都是独立的,和之前或之后的请求无关。这就意味着如果后续处理需要前面的信息,则必须重传数据,这样可能导致每次连接传送的数据量增大。例如,在网上商城系统中,有一些页面(比如发表评价页面、购买商品页面)需要用户登录后才能浏览。但在打开这些页面时系统并不知道访问者之前是否登录过,于是就可能出现要求用户重复登录的情况。由于HTTP无状态而造成的问题8.1.2解决方案
1.Cookie2.Session(会话)1.CookieCookie(小甜饼)有时也用其复数形式Cookies,指存储在用户本地上的少量数据,最经典的Cookie应用就是记录登录用户名和密码,这样下次访问时就不需要输入自己的用户名和密码了。也有一些高级的Cookie应用,例如在网上商城查阅商品时,该商城应用程序就可以记录用户兴趣和浏览记录的Cookies。在下次访问时,网站根据情况对显示的内容进行调整,将用户所感兴趣的内容放在前列。Cookie存在如下缺陷Cookie的数据大小是由限制的,大多数浏览器只支持最大为4096字节的Cookie。有时不能满足需求。客户端可以禁用或清空Cookie,从而影响程序的功能。当多人共用一台计算机时使用Cookie可能会泄露用户隐私,带来安全问题。2.Session(会话)Session可以保持网站服务器和网站访问者的交流,访问者可以将数据保存在网站服务器中。为了区分不同的访问者,网站服务器为每个网站访问者都分配一个会话编号SID,一个访问者在Session中保存的所有数据都与他的SID相关联。在访问者打开的所有页面中,都可以通过SID设置和获取Session数据,因此通过Session可以实现个页面间的数据共享。用户在任意一个页面登录后,都可以将登录标记和登录用户名保存在Session变量中。这样在其他页面中就可以获知用户已经登录了,从而避免重复登录。使用Cookie和Session技术的解决方案8.2Cookie的应用8.2.1Cookie的工作原理8.2.2设置Cookie数据8.2.3读取Cookie数据8.2.4删除Cookie数据8.2.5在用户身份验证时使用Cookie8.2.1Cookie的工作原理Cookie是Web服务器存放在用户硬盘的一段文本,其中存储着一些“键-值”对。每个Web站点都可以在用户的机器上存放Cookie,并可以在需要时重新获取Cookie数据。通常Web站点都有一个Cookie文件。Cookie的工作原理
8.2.2设置Cookie数据可以使用setcookie()函数设置Cookie数据,语法如下:bool
setcookie
(
string
$name
[,
string
$value
[,
int
$expire
=0
[,
string
$path
[,
string
$domain
[,
bool
$secure
=false
[,
bool
$httponly
=false
]]]]]])参数说明如下:
name,Cookie的名字。
value,Cookie的值。
expire,Cookie的有效期,单位为秒。
path
,Cookie的服务器路径,此目录下的网页都能访问该cookie。
domain,Cookie的域名,此域名下的网页都能访问该cookie。
secure,规定是否通过安全的HTTPS连接来传输cookie。
httponly,如果设置为TRUE,则只能通过HTTP访问Cookie,不能使用脚本语言(例如JavaScript访问Cookie)。如果设置为FALSE,则没有此限制。如果设置Cookie数据成功,则函数返回true,否则返回false。提示Setcookie()函数会发送网页头信息给客户端浏览器,浏览器会根据这些信息设置本地cookie,而<html>标签是网页正文,因此必须在头信息发送完之后才能发送,也就是说setcookie()函数必须在<html>之前才能正常工作。【例8-1】setcookie()函数的示例。<?php$value="mycookievalue";//发送一个简单的cookiesetcookie("TestCookie",$value,time()+60*60*24*30);?><html><body>...</body></html>8.2.3读取Cookie数据在PHP中,可以使用$_COOKIE数组读取Cookie数据,方法如下:Cookie值=$_COOKIE[Cookie名]也可以直接使用print_r()函数打印$_COOKIE数组的内容。改进【例8-1】,打印$_COOKIE数组的内容,代码如下:<?php$value="mycookievalue";//发送一个简单的cookiesetcookie("TestCookie",$value,time()+60*60*24*30);?><html><body><?phpif(isset($_COOKIE["TestCookie"]))echo($_COOKIE["TestCookie"]."<BR>");print_r($_COOKIE);?></body></html>【例8-2】【例8-2】的运行结果
使用Cookies记录用户访问网页的次数使用Cookies记录用户访问网页的次数8.2.4删除Cookie数据每个Cookie都有有效期,删除Cookie实际上就是将其有效期设置为过去的时间。【例8-4】删除TestCookie,代码如下:setcookie("TestCookie","",time()-3600);也就是将其有效期设置为1小时之前。8.2.5在用户身份验证时使用Cookie5.3.1小节介绍了使用表单提交用户身份认证信息的例子,本节对该例进行完善。用户可以选择在登录成功后,将用户身份认证信息保存在Cookie里,以便下次打开登录页面时自动带入用户名和密码。首先将5.3.1小节中的login.html改名为login.php,因为要在其中添加PHP程序。在login.php的表单中添加一个复选框checkboxCookie,其定义代码如下:<inputname="checkboxCookie"type="checkbox"checked>
用户名文本框在用户名文本框的定义代码中增加从Cookie中读取用户名信息的功能,具体如下:<inputtype="text"name="txtUserName"value="<?PHPecho($_COOKIE["username"]);?>"size="20">$_COOKIE["username"]中保存上次成功登录的用户名,保存方法将在稍后介绍。密码文本框在密码文本框的定义代码中增加从Cookie中读取密码信息的功能,具体如下:<inputtype="password"name="txtPwd"value="<?PHPecho($_COOKIE["password"]);?>"size="20">$_COOKIE["password"]中保存上次成功登录的密码,保存方法将在稍后介绍。check.php处理提交的用户身份认证信息的脚本为check.php。在check.php中,判断是否选中了复选框checkboxCookie,如果选中且登录成功,则将用户信息保存在Cookie中,代码如下:<?PHP//取输入的用户名和密码
$UID=$_POST['txtUserName'];$PWD=$_POST['txtPwd'];//验证用户名和密码
if($UID=="admin"and$PWD=="pass"){echo("您已经登录成功,欢迎光临。");if($_POST['checkboxCookie']=="on"){ setcookie("username",$UID,time()+60*60*24*365); setcookie("password",$PWD,time()+60*60*24*365);}}elseecho("登录失败,请返回重新登录。");?>在登录页面中自动加载用户名和密码在浏览器中访问login.php,登录成功,关闭浏览器。然后再次在浏览器中访问login.php,确认可以自动加载用户名和密码
8.3Session的应用8.3.1Session的工作原理8.3.2开始会话
8.3.3全局数组$_SESSION8.3.4删除会话变量8.3.5销毁会话8.3.6配置Session8.3.1Session的工作原理Session可以实现客户端和Web服务器的会话,Session数据也以“键-值”对的形式存储在文件中。与Cookie不同,Session数据保存在服务器上。在会话存续期间,Web服务器上的各页面都可以获取Session数据,从而了解与客户端沟通的历史记录。从而避免用户在浏览不同页面时重复输入数据(例如重复登录)。每个Web站点都同时与多个用户进行会话,那么,Web站点又是如何区分与它会话的用户呢?它会给每个访问者分配一个会话ID(SID,session_id)。用户第1次访问Web站点时会得到Web服务器分配的会话ID,以后每次浏览器提交请求都会带上这个会话ID,所有Session数据都与会话ID相关联。Session的工作原理8.3.2开始会话在PHP脚本中,可以使用session_start()函数开始会话,语法如下:boolsession_start(void)如果成功开始了会话,则函数返回True;否则返回False。session_start()函数会为该会话随机生成一个SessionID。可以使用session_id()函数获取或设置SessionID,语法如下:stringsession_id([string$id])如果使用参数$id,则将其设置为SessionID;否则直接返回当前的SessionID。SessionID用于标识一个Session。除了SessionID,Session还有一个名字。可以使用session_name()函数获取或设置Session的名字,语法如下:stringsession_name([string$name])如果使用参数$name,则将其设置为Session的名字;否则直接返回当前的Session名。【例8-5】开始会话并输出SessionID和Session的名字,代码如下:<?phpsession_start();echo("session_id()=".session_id());echo("<br>");echo("session_name()=".session_name());?>
输出结果如下:session_id()=kofmo9l06ka2kuv5jpjth95797session_name()=PHPSESSID8.3.3全局数组$_SESSION可以使用全局数组$_SESSION设置和获取Session数据,它的用法与普通数组相同,只是数组$_SESSION由系统定义,可以在程序的任何位置访问它。在访问数组$_SESSION之前,应该调用session_start()函数开始会话【例8-6】使用全局数组$_SESSION存取Session数据的例子。<?phpdate_default_timezone_set('Asia/Chongqing');//系统时间差8小时问题
//开始会话
session_start();if($_SESSION["last_visit"]){echo"您上次访问的时间为:";echodate("Y-m-d,H:i:s",$_SESSION["last_visit"]);echo"<br>";echo"访问次数:".$_SESSION["num_visits"];}elseecho"这是您的第1次访问。";$_SESSION["last_visit"]=time();$_SESSION["num_visits"]++;?>【例8-6】分析程序中定义了2个Session变量,$_SESSION["last_visit"]用于保存上次访问网页的时间,$_SESSION["num_visits"]用于保存访问网页的次数。程序中调用time()函数获取当前的系统时间戳,并保存为$_SESSION["last_visit"]。在获取时间戳之前需要调用date_default_timezone_set()函数设置时区为“Asia/Chongqing”,否则获取的时间与实际时间会相差8小时。date()函数用于格式化一个本地时间,即按指定格式返回时间字符串,其语法如下:stringdate(string$format[,int$timestamp])函数会根据时间戳$timestamp返回时间字符串。date()函数参数$format中常用的格式字符format字符具体描述返回值例子d月份中的第几天,有前导零的2位数字01~31D星期中的第几天,文本表示,3个字母Mon~Sunj月份中的第几天,没有前导零1~31l(“L”的小写字母)星期几,完整的文本格式Sunday~SaturdayNISO-8601格式数字表示的星期中的第几天1(表示星期一)~7(表示星期天)S每月天数后面的英文后缀,2个字符st,nd,rd或者th。可以和j一起用w星期中的第几天,数字表示0(表示星期天)~6(表示星期六)F月份,完整的文本格式January~Decemberm数字表示的月份,有前导零01~12M三个字母缩写表示的月份Jan~Decn数字表示的月份,没有前导零1~12t给定月份所应有的天数28~31L是否为闰年如果是闰年为1,否则为0Y4位数字完整表示的年份例如:1999或2012y2位数字表示的年份例如:99或12a小写的上午和下午值am或pmA大写的上午和下午值AM
或
PMg小时,12小时格式,没有前导零1~12G小时,24小时格式,没有前导零0~23h小时,12小时格式,有前导零01~12H小时,24小时格式,有前导零00~23i有前导零的分钟数00~59s秒数,有前导零00~59【例8-11】使用sp_tables存储过程返回所有用户表,可以使用如下命令:USEHrSystemGOEXECsp_tables@table_type="'TABLE'"GO结果如图8-7所示。第1次访问【例8-6】网页时的界面第2次访及以后访问【例8-6】网页时的界面8.3.4删除会话变量对于不需要保留的辉会话变量,可以调用unset()函数将其删除,释放占用的内存空间。unset()函数的语法如下:voidunset(mixed$var[,mixed$var[,$...]])可以看到,unset()函数可以同时释放多个变量。unset()函数不仅可以释放会话变量,也可以用来释放普通变量。【例8-7】使用unset()函数释放普通变量的例子。<?php$str="欢迎使用PHP!";$a=10;unset($str,$a);var_dump($str);var_dump($a);?>以脚本运行的结果如下:PHPNotice:Undefinedvariable:strinC:\workspace\test\hello.phponline6PHPStacktrace:PHP1.{main}()C:\workspace\test\hello.php:0PHPNotice:Undefinedvariable:ainC:\workspace\test\hello.phponline7PHPStacktrace:PHP1.{main}()C:\workspace\test\hello.php:0NULLNULL结果中提示程序中使用了未定义变量(实际是已经释放),最后输出了2个NULL。【例8-8】使用unset()函数释放会话变量的例子。<?php//开始会话
session_start();$_SESSION["num_visits"]++;unset($_SESSION["num_visits"]);echo($_SESSION["num_visits"]);?>以脚本运行的结果如下:PHPNotice:Undefinedindex:num_visitsinC:\workspace\test\hello.phponline7PHPStacktrace:PHP1.{main}()C:\workspace\test\hello.php:08.3.5销毁会话尽管超过有效期的Session数据会被自动销毁,但也可以使用PHP提供的系统函数手动销毁会话。1.session_unset()函数session_unset()函数的功能是释放所有的Session变量,但不删除session文件以及不释放对应的sessionID,其语法如下:voidsession_unset(void)【例8-9】使用session_unset()函数销毁会话的例子。<?php//开始会话
session_start();$_SESSION['user']='admin';session_unset();echo($_SESSION['user']);$_SESSION['user']='admin';?>程序的运行结果如下:用户名:session_id:7u2pv7m6jijlhi4smdte09q2f5可见,调用session_unset()函数后Session变量$_SESSION['user']被释放,但sessionID并没有被释放。2.session_destroy()函数session_destroy()函数的功能是删除当前用户对应的session文件以及释放sessionid,内存中的$_SESSION变量内容依然保留,其语法如下:boolsession_destroy(void)【例8-10】使用session_un
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- TY/T 3501.2-2024高山滑雪板性能测定第2部分:质量和极惯性矩
- NB/T 11524-2024矿用喷水灭火机器人通用技术要求
- 课题申报书全部
- 法治思维课题申报书
- Unit 3 Keep Fit section B 2a-2c 同步课时讲练(含答案)七年级英语下册(人教版2024)
- 广州 社科 课题申报书
- 合同范本模板不能复制
- 不让停车协议合同范本
- 体育和音乐课题申报书
- 医疗会议服务合同范例
- 第19章-城市设计课件
- 人事管理管理制度
- 临床检验基础-课件
- 大型储罐计算书
- 2022-2023学年广东省广州市荔湾区统考初三第一次模考数学试题含解析
- 针对本项目售后服务方案
- 2022年桂林电子科技大学高等学历继续教育学士学位英语考试真
- 新人教版七至九年级英语单词表 汉译英(含音标)
- 新固废法课件PPT
- 侯马北车辆段2023年运用机考复习题-曲沃作业场
- 城市轨道交通深基坑施工作业指导书
评论
0/150
提交评论