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.留言板页面,好友采取下拉列表,当留言信息为空时,显示提示 ...
随机推荐
- VS2008 MFC截取整个屏幕并保存为jpg格式
void CMainFrame::OnSavejpg() { // TODO: 在此添加命令处理程序代码 HWND hwnd = this->GetSafeHwnd(); //得到窗口句柄 HD ...
- java形式参数分别是基本类型和引用类型的调用
什么是形式参数,基本类型,引用类型? 形式参数(形参)百度百科里的解释是:在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数. 通俗的说就是:形式参数是指在函数名后面的小括号里 ...
- git操作实战指南
1 背景 小白进入公司,进入日常多人开发,git的使用应该是新人要掌握的第一个技能.git是一个分布式数据存储库,分为远程存储和本地存储,本地存储的话,每一台计算机就相当于一个存储数据库,可以记录和存 ...
- E20170414-ms
collapse v/n 奔溃,垮台 constraint n 约束,限制 adaptive adj 适应的; 有适应能力的; exhausitive adj. 详尽的; store n 商店,仓 ...
- python 测试用例
mydict.py代码如下: class Dict(dict): def __init__(self, **kw): super().__init__(**kw) def __getattr__(se ...
- CF1059E Split the Tree(倍增)
题意翻译 现有n个点组成一棵以1为根的有根树,第i个点的点权为wi,需将其分成若干条垂直路径使得每一个点当且仅当被一条垂直路径覆盖,同时,每条垂直路径长度不能超过L,点权和不能超过S,求最少需要几条垂 ...
- Electron开发
[Debug] 1)cmd进入项目所在根目录,输入: $ npm install --save-dev devtron$ npm install --save electron-debug 2)在主j ...
- elasticsearch接口开发(新)
此文在上一篇文章的基础上稍做了些许修改,主要在springboot整合ES后的包路径上,如下是新的目录结构 下面贴出代码 MyConfig.java package com.ylht.config; ...
- Jquery | 基础 | 慕课网 | 类选择器
原生getElementsByClassName()函数的实现代码与jQuery实现代码的比较: <!DOCTYPE html> <html> <head> < ...
- 167 Two Sum II - Input array is sorted 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数.函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2.请注意,返回的下标值(i ...