学习要点

  • 会话控制使用的意义
  • 用户跟踪方式
  • 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 会话控制的更多相关文章

  1. 会话控制:session与cookie

    我们在浏览网站时,访问的每一个web页面都需要使用"http协议"实现.而HTTP协议是无状态协议,就是说HTTP协议没有一个内建机制来维护两个事务之间的状态.当一个用户请求一个页 ...

  2. php 会话控制

    会话控制 HTTP协议,在TCP协议基础上的HTTP协议称为无状态协议 SESSION COOKIE SESSION特点:1.存储在服务器.2.每个使用者都会生成一个SESSION.3.有默认的过期时 ...

  3. (实用篇)php通过会话控制实现身份验证实例

    会话控制的思想就是指能够在网站中根据一个会话跟踪用户.这里整理了详细的代码,有需要的小伙伴可以参考下. 概述 http 协议是无状态的,对于每个请求,服务端无法区分用户.PHP 会话控制就是给了用户一 ...

  4. 会话控制:SESSION,COOKIE

    1.http协议: HTTP—超文本传输协议,在TCP协议(长连接.像一个硬件)基础上; 特点:短连接,无状态协议,没法记录本次连接的状态;适用于静态页面的访问,对于后期某些页面是需要浏览器预知客户信 ...

  5. PHP之自定义会话控制---使用文件处理

    前三篇简单的总结了下会话控制和文件操作,这一篇说说会话控制的自定义处理方式.既然知道了文件的基本读写,而且在会话控制中,也有人提到,session数据可以保存到缓存或数据库中,实际上当然不会是直接利用 ...

  6. PHP之会话控制小结

    会话控制是一种跟踪用户的通信方式,使用会话控制主要基于以下几点:由于http协议的无状态性,使得不能通过协议来建立两次请求之间的关联:对于通常的页面之间的数据传递方式get和post而言,主要处理参数 ...

  7. php——会话控制

    1.什么叫做会话控制 允许服务器根据客户端做出的连续请求. 2.为什么需要会话控制? 因为当你打开一个网站,并想访问该网站的其他页面的时候,如果没有会话控制,当跳转到其他页面的 时候,就需要再次输入账 ...

  8. PHP会话控制Session与Cookie

    理解会话控制的概念: 阅读过HTTP协议相关资料的同学都会知道HTTP协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议,所谓无状态,指的是不会维护http请求数据,http请求是 ...

  9. (详细)php实现留言板---会话控制-----------2017-05-08

    要实现留言功能,发送者和接受者必不可少,其次就是留言时间留言内容. 要实现的功能: 1.登录者只能查看自己和所有人的信息,并能够给好友留言 2.留言板页面,好友采取下拉列表,当留言信息为空时,显示提示 ...

随机推荐

  1. EasyUI 表格点击右键添加或刷新 绑定右键菜单

    例1 在HTML页面中设置一个隐藏的菜单(前提是已经使用封装的Easyui) 代码: <div id="contextMenu_jygl" class="easyu ...

  2. hdoj1176【DP】

    DP基础吧.A掉还是挺爽的.就是考虑在两端只能是从前一秒的内部一米或原来的点来进行,但是在5秒以内可到达点是逐渐外扩的,并不是[0,10],所以就特殊考虑了一下.后面两端是0和10,中间的点可以从上一 ...

  3. 二分优化的lis

    /*此题为一个女大佬教我的,%%%%%%%%%%%%*/ 题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为 ...

  4. 第十八篇 .NET高级技术之Linq与EF Code-First Fluent API基础讲解

    1.FluentApi简介 在这里提供了一个fluentapi基础的DEMO然后咱们在进一步的学习,直接上干货. 第一步在数据库创建一个表:person 第二步:新建控制台程序FluentAPI 第三 ...

  5. Git如何克隆Gitlab?Git本地仓库如何上传Gitlab?

    首先确保本机已经安装上Git,其次确认可以正常访问Gitlab服务器 环境: Git:Centos 7.x  192.168.126.138 Gitlab: Centos7.x 192.168.126 ...

  6. spring+redis 报错 org.springframework.core.serializer.support.DeserializingConverter.<init>(Ljava/lang/ClassLoader;)V

    这个问题的原因大概就是spring-data-redis.jar包版本不对 ,下面版本可以正常启动 <dependency> <groupId>org.springframew ...

  7. bryce1010专题训练——划分树

    1.求区间第K大 HDU2665 Kth number /*划分树 查询区间第K大 */ #include<iostream> #include<stdio.h> #inclu ...

  8. Educational Codeforces Round 24 E

    Vova again tries to play some computer card game. The rules of deck creation in this game are simple ...

  9. Sublime3注册码和安装中文包

    1.Sublime3注册码 在工具栏Help中点击Enter license,粘贴下面一大串 —– BEGIN LICENSE —– Michael Barnes Single User Licens ...

  10. 使用json传输数组实例

    client.php <?php //遍历数组元素,并将元素转码 function array_iconv($data, $in_charset='GBK', $out_charset='UTF ...