PHP13 会话控制
学习要点
- 会话控制使用的意义
- 用户跟踪方式
- Cookie的设置、读取以及删除
- Session的设置、读取以及删除
- 自定义session处理方式
会话控制
什么是会话控制
实现服务器跟踪同一个客户端的连续请求。包含两方面内容:
- 在一个网页中跟踪用户
- 在多个网页之间共享数据
会话跟踪的方式
HTTP是无状态协议,不能维护两个事务之间的状态。
PHP提供了三种会话跟踪方式:
- 超链接、隐藏域或者header()函数重定向。
- Cookie方式,将用户状态信息保持在客户端。
- Session方式,将用户状态保存在服务器。
简单参数的交互,采用第一种的方式的url的get或者http的post方式实现。
网页需要判断用户信息,一般采用Cookie或者Session技术。
Cookie
Cookie概念
cookie是Web服务器保存在客户端的一系列文本信息
cookie的作用:对特定对象的追踪、统计网页浏览次数、简化登录
安全性:容易信息泄露
Cookie的设置
- 通过setCookie()函数创建Cookie()。
Cookie信息是HTTP信息头的一部分,因此SetCookie()函数必须在其他信息被输出到浏览器前被调用。
header()函数和setCookie()函数:必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。
- 语法格式说明
bool setcookie(name,value,expire,path,domain,secure)
- 示例代码
//cookie常用三个参数设置 setcookie("userName","admin",time()+5*60); //cookie全参数设置:cookie只在action目录和其子目录有效,子域名有效,仅https中设置cookie setcookie("userName","root",time()+5*60,"/action",".example.com",1);
Cookie的读取
- 计算机中Cookie的保存位置:
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies
- 通过$_COOKIE读取Cookie,示例代码:
print_r($_COOKIE);
Cookie数组的设置和读取
将多个键值信息保存在相同的Cookie名称标识下。
示例:
设置cookie
setcookie("user[name]","admin"); setcookie("user[pwd]",md5(123456)); setcookie("user[id]","administrator group");
读取cookie:
//print_r($_COOKIE); foreach ($_COOKIE["user"] as $key=>$value){ echo $key.":".$value.'<br>'; }
删除Cookie
- Setcookie(cookie名称)
删除同名cookie
- Setcookie(cookie名称,time()-1)
设置cookie已过期状态。默认cookie生命周期与浏览器生命周期一致。
使用Cookie实现用户登陆跟踪
- 登陆页面代码:
<?php error_reporting(0); /**清除cookie*/ function clearCookies() { setcookie ( "userName", '', time () - 1 ); setcookie ( "isLogin", '', time () - 1 ); } /**登陆与退出判断*/ if ($_GET ["action"] == "login") {//登陆 clearCookies (); if ($_POST ["userName"] == "admin" && $_POST ["password"] == "8888") { setcookie ( "userName", $_POST ["userName"], time () + 7 * 24 * 60 * 60 ); setcookie ( "isLogin", "1", time () + 7 * 24 * 60 * 60 ); header ( "location:index.php" ); } else { die ( "用户名或者密码错误" ); } } else if ($_GET ["action"] == "logout") {//退出 clearCookies (); } ?> <html> <head> <title>用户登录</title> </head> <body> <fieldset> <legend>用户登录</legend> <form action="login.php?action=login" method="post"> <P>账号:<input type="text" name="userName"></P> <P>密码:<input type="password" name="password"></P> <p><input type="submit" value="登陆"></p> </form> <p></p> </fieldset> </body> </html>
- 网站首页代码:
<?php if (! (isset ( $_COOKIE ['isLogin'] ) && $_COOKIE ['isLogin'] == 1)) { header ( "location:login.php" ); exit (); } ?> <html> <head> <title>首页</title> </head> <body> <?php echo "您好:" . $_COOKIE ["userName"] . " "; ?> <a href="login.php?action=logout">退出</a> <p>内容......</p> </body>
上机练习1:使用用cookie实现免输入用户名密码登录
需求说明:登陆成功后,5分钟内再次访问登陆页面实现免输入账号密码登录。
Session
相关概念
- Session的中文译名叫做“会话”,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。
- Session通过SessionID来识别用户。PHP服务器生成SessionID,保持在tmp目录中,以文件形式存在。客户端以cookie或者url保存SessionID,每次用户访问的时候,通过检测客户端和服务器端的sessionid是否一致来确认同一用户。
- 当客户端禁用COOKIE时(点击IE中的“工具”—“internet="">Internet选项”,在弹出的对话框里点击“安全”—“自定义级别”项,将“允许每个对话COOKIE”设为禁用),session_id将无法传递,此时SESSION失效。不过php5在linux/unix平台可以自动检查cookie状态,如果客户端设置了禁用,则系统自动把session_id附加到url上传递。windows主机则无此功能。
- Sessoin将用户信息存储在服务器端。安全性高。
配置Session
- 打开php.ini文件中[Session]配置信息
session.auto_start = 0 ; #是否自动启动session,按照默认值方式。如果设置为1,则session无法存储对象。 session.save_handler = files ; #session的文件储存方式 session.save_path = /tmp ; #session的保存路径 session.use_cookies = 1 ; #使用cookie在客户端保存sessionid session.name = PHPSESSID ; #sessionid命名规则 session.cookie_lifetime = 0 ; #sessionid的cookie生存时间,0代表直到浏览器关闭 session.cookie_path = / ; #sessionid的cookie路径 session.cookie_domain = ; #sessionid的cookie域名 session.serialize_handler = php ; #使用PHP序列化机制 session.gc_maxlifetime = 1440 ; #session文件的保存时间
Session的声明与使用
- 启动session
bool seseion_start()
- 注册session
$_SESSION[];
- 示例代码
session注册对象类型数据需要注意:1、确认配置文件中的序列化和反序化机制已经配置;2、如果第1点没有配置,则使用serialize()和unserialize();3、注册和读取对象的脚本中需要引入对象的类脚本文件。
用户信息保存在session.save_path设定的目录下,文件名为:sess_sessionid,文件格式为:
变量名|类型:长度:值
例如:
userName|s:5:"admin";userID|i:1001;
Session的销毁与变量的注销
- 当使用完$_SESSION中的变量后,可以对其注销和删除。
当完成一个会话后,可将会话销毁。
- Session完全注销过程:
1、删除session变量:
逐个删除:unset($_SESSION[varname])
或者:
全部删除:$_SESSION=array();
2、删除客户端cookie中的sessionid:
Setcookie(session_name());
3、销毁服务器上存储的sesssion信息:
Bool session_destroy ( void )
示例代码:
//第一步:开启session并初始化 session_start(); //第二步:删除所有session变量,或使用unset($_SESSION[*])逐个删除 $_SESSION=array(); //第三步:删除基于cookie的session信息 if(isset($_COOKIE[session_name()])){ setcookie(session_name(),'',time()-1,'/'); } //第四步:销毁session session_destroy();
上机练习2:使用session实现用户的登陆跟踪
需求说明:
1、定义系统用户类,包含属性:账号、密码、是否是管理员
2、登陆成功后初始化用户:管理员对象和普通用户对象。将用户对象保存在session中,跳转到管理后台页面。
3、管理后台页面读取session中的用户信息,个性化显示用户网页内容。
Session的自动回收机制
- Session垃圾文件自动回收
如果客户端没有正常退出会话,服务器端保留的Session文件不会被删除。
如果没有被SessionID引用的服务器端Session文件,就成为“垃圾”Session文件。
PHP服务器根据session.gc_maxlifetime指定的时间去检测服务器中的session文件,如果session文件的修改时间大于这个时间,PHP服务器便会清除相应的session文件。
- 垃圾回收机制何时启动
每次执行session_start()函数就会启动php的垃圾回收机制,如果一个项目有多个页面,多个session_start()被频繁访问,则垃圾回收机制就会被频繁启动,影响系统性能。
可以通过设置php.ini来减少垃圾回收机制的启动频率。
推荐值:session.gc_probaility=1
推荐值:session.gc_divisor=[1000~5000]
垃圾回收启动频率= Session.gc_probaility/ Session.gc_divisor
PHP13 会话控制的更多相关文章
- 会话控制:session与cookie
我们在浏览网站时,访问的每一个web页面都需要使用"http协议"实现.而HTTP协议是无状态协议,就是说HTTP协议没有一个内建机制来维护两个事务之间的状态.当一个用户请求一个页 ...
- php 会话控制
会话控制 HTTP协议,在TCP协议基础上的HTTP协议称为无状态协议 SESSION COOKIE SESSION特点:1.存储在服务器.2.每个使用者都会生成一个SESSION.3.有默认的过期时 ...
- (实用篇)php通过会话控制实现身份验证实例
会话控制的思想就是指能够在网站中根据一个会话跟踪用户.这里整理了详细的代码,有需要的小伙伴可以参考下. 概述 http 协议是无状态的,对于每个请求,服务端无法区分用户.PHP 会话控制就是给了用户一 ...
- 会话控制:SESSION,COOKIE
1.http协议: HTTP—超文本传输协议,在TCP协议(长连接.像一个硬件)基础上; 特点:短连接,无状态协议,没法记录本次连接的状态;适用于静态页面的访问,对于后期某些页面是需要浏览器预知客户信 ...
- PHP之自定义会话控制---使用文件处理
前三篇简单的总结了下会话控制和文件操作,这一篇说说会话控制的自定义处理方式.既然知道了文件的基本读写,而且在会话控制中,也有人提到,session数据可以保存到缓存或数据库中,实际上当然不会是直接利用 ...
- PHP之会话控制小结
会话控制是一种跟踪用户的通信方式,使用会话控制主要基于以下几点:由于http协议的无状态性,使得不能通过协议来建立两次请求之间的关联:对于通常的页面之间的数据传递方式get和post而言,主要处理参数 ...
- php——会话控制
1.什么叫做会话控制 允许服务器根据客户端做出的连续请求. 2.为什么需要会话控制? 因为当你打开一个网站,并想访问该网站的其他页面的时候,如果没有会话控制,当跳转到其他页面的 时候,就需要再次输入账 ...
- PHP会话控制Session与Cookie
理解会话控制的概念: 阅读过HTTP协议相关资料的同学都会知道HTTP协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议,所谓无状态,指的是不会维护http请求数据,http请求是 ...
- (详细)php实现留言板---会话控制-----------2017-05-08
要实现留言功能,发送者和接受者必不可少,其次就是留言时间留言内容. 要实现的功能: 1.登录者只能查看自己和所有人的信息,并能够给好友留言 2.留言板页面,好友采取下拉列表,当留言信息为空时,显示提示 ...
随机推荐
- org.hibernate.hql.ast.QuerySyntaxException: Student is not mapped [from Student as stu where stu.sclass=?]
java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: t_aty_disease is not ...
- 量子纠缠1——量子比特、Bell态、EPR佯谬
量子纠缠是量子物理的基本性质,他描述的是:当几个粒子相互作用后,无法单独描述各个粒子的性质,只能整体描述,本文主要介绍两个量子比特之间的纠缠. 量子比特(Qubit) 量子比特是量子计算的基本单位,就 ...
- HDU - 2828 网络流
题目大意 有n个灯,m个开关,由于线路乱接导致可能有多个开关对应一个灯(并联),有的灯在开关开的时候亮 有的灯在开关关的时候亮,[每个开关最多对应两盏灯],试找出一种开关的ON,OFF状态,使得所有灯 ...
- BZOJ1787 meet
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1787 水题,但是结论很有趣. 题目求的是距离三个点之和最小的点. 这个很显然是在三个LCA上, ...
- cocos2d-x 坐标系解惑
1.CCTouch* touch->getLocation() ---- 返回当前触摸点在openGL坐标系中的位置 openGL坐标系,原点在左下角,x向右为正,y向上为正. 2.CCTouc ...
- linux中vfork对打开文件的处理
vfork和fork fork()函数是拷贝一个父进程的副本,拥有独立的代码段 数据段 堆栈空间 然而vfork是共享父亲进程的代码以及代码段 vfork是可以根据需要复制父进程空间,这样很大程度的提 ...
- codeforces 632C
题意: 给n个字符串,然后将这些字符串组合,搞成一个最小字典序的字符串,然后输出就好了. 思路: 记得以前神队友给我说过你怎么将n个字符串按字典序的比较从小到大输出.那么我也是这样玩一下,然后组合输出 ...
- iOS 跷跷板动画 Seesaw Animation
Xcode Playgound示例代码: let testView = UIView() testView.frame = CGRect.init(x: , y: , width: , height: ...
- js 合并2个结构
var conditions = getJsonObj("conditionArea"); var plogId = { ProgId: getProgId() }; $.exte ...
- Jmeter之文件下载
Jmeter文件下载 1.打开jmeter新建线程组—>http请求 2.在百度上选择一个图片下载,选择图片右击复制图片地址 https://ss1.baidu.com/9vo3dSag_xI4 ...