学习要点

  • 会话控制使用的意义
  • 用户跟踪方式
  • 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. Hibernate中两种获取Session的方式

    转自:https://www.jb51.net/article/130309.htm Session:是应用程序与数据库之间的一个会话,是hibernate运作的中心,持久层操作的基础.对象的生命周期 ...

  2. Table View Programming Guide for iOS---(六)---A Closer Look at Table View Cells

    A Closer Look at Table View Cells A table view uses cell objects to draw its visible rows and then c ...

  3. Codeforces - Gym102028 - 2018 Jiaozuo Regional Contest

    http://codeforces.com/gym/102028 A. Xu Xiake in Henan Province 看起来像水题.乱搞一下,还真是. #include<bits/std ...

  4. thrift配置——windows客户端与linux服务端通信(C++)

    windows客户端: 1.首先要安装boost库 下载源文件 2.安装boost之前先要安装python-3.4.0.amd64,很多地方没有说,弄了很久 3.运行bootstrap.bat 生成b ...

  5. HDU2438:Turn the corner(三分)

    传送门 分析 根据这张图,我们只要使得h<=y即可,可以发现h是一个凸函数,故使用三分,具体见代码 代码 #include<cstdio> #include<cstring&g ...

  6. 51nod1014【暴力】

    直接暴力1e6就好了 #include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { LL ...

  7. C++ C# 默认对齐是8字节

    C++ C# 默认对齐是8字节 以上,一直以为是4字节,尼玛

  8. bzoj 1396: 识别子串 && bzoj 2865: 字符串识别【后缀数组+线段树】

    根据height数组的定义,和当前后缀串i最长的相同串的长度就是max(height[i],height[i+1]),这个后缀贡献的最短不同串长度就是len=max(height[i],height[ ...

  9. locate的基本用法

    一.工作原理 1. locate是通过读取一个或多个由updatedb命令生成的数据库来查找文件的,而updatedb由计划任务程序cron每天运行来更新缺省的数据库(/var/lib/mlocate ...

  10. MySQL `explicit_defaults_for_timestamp` 与 TIMESTAMP

    考察下面的 SQL 脚本: CREATE TABLE test1( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, data VARCHAR(20), ts1 ...