文章目录

  • 为什么要使用回话,PHP使用回话的三种方式
  • PHP操作Cookie和Session的应用
    • Cookie实现控制登录时间(通过确保客户端的Cookie存活时间来确保登录有效时间)
    • Cookie实现自动登录(判断客户端中是否存在用户名Cookie和密码Cookie,若存在,表示非首次登录,可以不输入用户名和密码,直接提交登录)
    • Session通过Cookie传递Session ID实现限制访问时间(只适用于客户端没有禁用Cookie的情况)
    • 利用Session保存验证码信息以及Cookie保存用户名以及密码实现用户注册例子
    • 利用Session控制不同用户的用户级别以实现用户权限管理
    • Session实现网站防刷计数器
    • Session实现设计网页换肤
    • 管理服务器端Session缓存

为什么要使用回话,PHP使用回话的三种方式

PHP会话机制是用于保持用户连续访问网站时的相关数据,以便能够根据用户的信息定制程序,增加站点的吸引力。在浏览网站时,访问的每一个页面都需要使用HTTP协议来实现。而HTTP协议是无状态的协议,当一个用户请求一个页面之后,再请求同一个网站上的其它页面时,HTTP协议不知道这两个请求是否是来自同一个用户,会被当作独立的请求,不会将这两次访问联系在一起。

会话机制能够允许服务器跟踪同一个客户端发出的连续请求。这样,就可以很容易的做到用户登录的支持,而不是在浏览一个网页时重复执行登录的动作。当然,除了使用会话在同一个网站中跟踪用户外,对同一个访问者的请求还可以在多个页面之间为其共享数据。

PHP提供3种会话机制:

  • (1)使用超链接或者header()函数等重定向方式
    通过在URL的GET请求中附加参数(查询字符串)的形式,将数据从一个页面传递给另一个页面中。也可以通过表单的隐藏域,将用户信息在提交表单时传递给其它页面。
  • (2)使用Cookie
    将用户的状态信息存储在客户端的计算机中,让其它程序能够通过存取客户端计算机的Cookie,来存取用户信息。Cookie是存储在客户端计算机中的一个文本文件,包含一组字符串。当用户访问网站时,PHP会在用户的计算机上创建一个文本文件,把用户信息保存在其中,作为持续跟踪用户的一种方式。Cookie信息一般不加密,存在泄漏风险。为了防止类似的问题,Cookie设置了一套机制只允许客户端Cookie被创建它的域读写,其他浏览器或者网站都无法读写Cookie文件。此外,Cookie文件是临时文件,默认情况下,当用户离开网站时就会被自动删除。但可以通过脚本,让一些文件长久保存,当用户再次访问站点时,可以继续进行读取操作。虽然Cookie可以长期保存在客户端浏览器中,但也不是一成不变。一般而言,浏览器最多允许存储300个Cookie文件,而且每个Cookie文件支持最大容量为4KB。每个域名最多支持20个Cookie。
  • (3)使用Session
    将访问者的状态信息存放于服务器之中,让其它程序能够通过服务器中的文件或者数据库,来存取用户信息。Session会话保存的数据在PHP中是以变量的形式存在,创建的会话变量在声明周期中可以跨页引用。由于Session会话是存储在服务器端的,相对安全,也没有存储长度的限制。在PHP中Session表示服务器与客户端之间的一个会话,它从用户点击进入站点开始,到用户离开网站结束。也可以使用PHP提前,主动结束会话,终止Session对象的运行。PHP默认Session是基于Cookie的,Session ID被服务器存储在客户端的Cookie中。Session会话具有针对性,不同的用户拥有不同的会话。一旦进入网站,PHP都会自动为每一个用户建立独立的Session对象,Session对象通过session_id属性进行标识,每一次会话都会生成一个永不重复的随机值。用户在网站内只能访问自己的Session,而不能访问其它用户的Session。使用Session可以存储用户信息,如用户姓名,访问时间,访问页面,以及每个页面的停留时间等,通过这些基本信息能够统计出用户的浏览习惯、个人爱好等。Session适合存储少量信息,不能长期存储。如果要长期存储,建议把Session信息存储到服务器端的文件或者数据库。

PHP操作Cookie和Session的应用

Cookie实现控制登录时间(通过确保客户端的Cookie存活时间来确保登录有效时间)


index.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>用户登录</h2>
<form name="form1" method="post" action="index_ok.php"><p> 用户名:<input name="user" type="text" size="20"></p><p> 密&nbsp;&nbsp;&nbsp;码 :<input name="pass" type="password" maxlength="20"></p><p><input type="submit" name="Submit" value="提交"></p>
</form>
</body>
</html>

index_ok.php

<?php
header( "Content-type: text/html; charset=UTF-8" ); //设置文件编码格式
if($_POST['user']!="" && $_POST['pass']!="")
{if($_POST['user']=="admin" && $_POST['pass']=="admin"){setCookie("user",$_POST['user'],time()+5)or die("禁止cookie");//将用户名保存到客户端Cookie中setCookie("pass",$_POST['pass'],time()+5)or die("禁止cookie");//将密码保存到客户端Cookie中echo "<script>alert('登录成功!'); window.location.href='cookie.php';</script>";}else{echo "<script>alert('用户名或者密码不正确!'); window.location.href='index.php';</script>";}
}else{echo "<script>alert('用户名或者密码不能为空!'); window.location.href='index.php';</script>";
}
?>
setcookie(name,value,expire,path,domain,secure)

setcookie()函数参数说明

参数 说明
name 必须,定义Cookie的名称
value 必须,定义Cookie的值
Expire 可选。定义Cookie的有效期,此处time()+5表示5秒后Cookie过期,需要重新登录
path 可选,定义Cookie的服务器路径
domain 可选,定义Cookie的域名
secure 可选,定义是否通过安全的HTTPS连接来传输Cookie

在PHP中使用$_COOKIE预定义变量读取setcookie()函数设置的Cookie名称

$_COOKIE['user']=="admin" && $_COOKIE['pass']=="admin"

cookie.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>登录提示</h2>
<?phpif($_COOKIE['user']=="admin" && $_COOKIE['pass']=="admin"){echo "欢迎".$_COOKIE['user']."光临!";}else{echo "<script>alert('COOKIE已经过期,请重新登录'); window.location.href='index.php';</script>";}
?>
</body>
</html>

输出:



Cookie实现自动登录(判断客户端中是否存在用户名Cookie和密码Cookie,若存在,表示非首次登录,可以不输入用户名和密码,直接提交登录)

如果用户是第一次登录,则需要填写用户名密码。如果是再次登录,那么就不需要输入用户名和密码,因为$_Cookie会从Cookie中读取这些信息,用户直接单击登录按钮即可。登录成功之后进入main.php页面

index.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>自动登录</h2>
<form id="form1" name="form1" method="post" action="index_ok.php"><p>登录名称:<input name="name" type="text" class="txt" id="lgname" value="<?php if (! empty ( $_COOKIE['name'] )) echo $_COOKIE['name'];?>" size="20"></p><p>登录密码:<input name="pwd" type="password" class="txt" id="lgpwd" value="<?php if (! empty ( $_COOKIE['pwd'] )) echo $_COOKIE['pwd'];?>" size="20"></p><p>保存时间:<input name="times" type="radio" value="3600" checked="checked">1小时<input type="radio" name="times" value="86400">1天 </p><p><input type="submit" name="Submit" value="提 交"><input type="reset" name="reset" value="重 置"></p>
</form>
</body>
</html>

index_ok.php

<?php
header("Content-type: text/html; charset=UTF-8");  //设置文件编码格式
if (! empty ( $_POST ['name'] ) and ! empty ( $_POST ['pwd'] ))
{ //判断用户名和密码是否为空if ($_POST ['name'] == "admin" && $_POST ['pwd'] == "admin") //如果有设置表单对象name以及pwd的话,再进行客户端Cookie的设置{setcookie ( "name", $_POST ['name'], time () + $_POST ['times'] ); //设置cookie有效时间为1小时,将用户名保存到客户端Cookie中setcookie ( "pwd", $_POST ['pwd'], time () + $_POST ['times'] ); //设置cookie有效时间为1小时,将密码保存到客户端Cookie中echo "<script>alert('succeed!');window.location.href='main.php';</script>";} else {echo "<script>alert('false!');window.location.href='index.php';</script>";}
}
else //若文本输入框为空,则判断客户端是否设置了用户名Cookie和密码Cookie
{if($_COOKIE['name']=="admin" && $_COOKIE['pwd']=="admin")//即客户端已经存在Cookie,则直接空用户名和空密码可以登录{echo "<script>alert('succeed!');window.location.href='main.php';</script>";}else{echo "<script>alert('用户名和密码不能为空!');window.location.href='index.php';</script>";}
}
?>

main.php

<?php
if($_COOKIE['name']==""){   //根据Cookie的值,判断浏览者是否具有访问该页面的权限echo "<script>alert('您不具有访问该页面的权限!'); window.location.href='index.php';</script>";//如果不具有,输出请您正确登录,并跳转到登录页面
}else{       //如果正确则输出主页内容
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>登录提示</h2>
<p><?php echo $_COOKIE['name'] ?> 成功登录</p>
</body>
</html>
<?php
}
?>

输出:


若直接登陆过,接下来在相应Cookie时间内,可以不输入用户名和密码登录

Session通过Cookie传递Session ID实现限制访问时间(只适用于客户端没有禁用Cookie的情况)


index.php

<?phpif(!isset($_SESSION)){ //$_SESSION如同$_POST、$_GET 或者$_COOKIE 等一样成为超级全局数组,但是该数组只有在调用session_start()函数之后才能使用session_start();
}
$session_id=session_id();   //不同客户端访问获取的服务器分配的SessionID不同
setcookie("start",$session_id,time()+10);//将服务器分配的SessionID在客户端以Cookie(创建一个名为start的Cookie名称保存)形式保存,该Cookie在客户端存活10秒
echo $session_id;//打印服务器端跟踪客户端的sessionid
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<?phpif(isset($_COOKIE['start']) && $_COOKIE['start']==$session_id){//服务器脚本查看客户单Cookie名称内容是否对应同一个SessionID,若是则判断是同一个用户
?>
<img src="data:images/index.jpg"><!--假设允许已登录的用户,即分配了SessionID的客户端访问首页-->
<?php}else{?>
<img src="data:images/login.jpg"><!--若判断客户端的Cookie没有存储一个SessionID,只能访问登录页面。-->
<?php
}
?>
</body>
</html>

第一次访问index.php输出:

10s内快捷键F5刷新同一页面输出:


10s后快捷键F5刷新同一页面输出:

执行index.php脚本后,Session对象就会被保存在服务器端的某个文件中。该文件的位置时通过php.ini文件的session.save_path属性指定的目录下。如我的环境下:

session.save_path = "F:/WAMP_Environment/PHP7.1/tmp"

到该目录下查看可以看到:

可以看到每个Session文件以每个客户端的SessionID来命名,由于我们没有为Session指定Session变量,类似如下,所以该文件为空。

$_SESSION["username"]="root";//注册Session变量,赋值为一个用户的名称
$_SESSION["password"]="123456";//注册Session变量,赋值为一个用户的密码

否则的话,我们打开该文件应该显示:

username|s:4:"root";password|s:6:"123456";

格式为:变量名|类型:长度:值;变量名|类型:长度:值

客户端也可以查看Cookie,如我的IE浏览器在

C:\Users\xxxx\AppData\Local\Microsoft\Windows\INetCache

所有Cookie都被存放在客户端临时文件中,存放Cookie的文本文件的命名规则为:

用户名@网站名

文件类型为Cookie。我们打开一个却显示:

Cookies are no longer stored in files.  Please use Internet*Cookie* APIs to access cookies.

意思是要使用Cookie相关API才能查看,我又用谷歌浏览器Chrome查看得到我index.php脚本设置的客户端浏览器Cookie信息。如下图:

利用Session保存验证码信息以及Cookie保存用户名以及密码实现用户注册例子


index.php

<!DOCTYPE>
<html>
<head>
<meta charset="utf-8">
<title>用户注册</title>
</head>
<body>
<h2>用户注册</h2>
<form name="form1" method="post" action="index_ok.php">
<br>
用户名:
<input name="name" type="text" value="<?php  if (! empty ( $_COOKIE['name'] )) echo $_COOKIE['name'];?>" size="15"><!--size 属性规定输入字段的宽度。用户名取决于客户端浏览器的Cookie的name变量是否存在,否则值为空-->
&nbsp;&nbsp;
<input name="check" type="submit" id="check" value="检测所填用户名是否被注册"><!--提交按钮1--><br><br>密&nbsp;&nbsp;&nbsp;码:
<input name="pwd" type="password" value="<?php if(!empty($_COOKIE['pwd'])) echo $_COOKIE['pwd'];?>" size="15"><!--size 属性规定输入字段的宽度。用户名取决于客户端浏览器的Cookie的pw变量是否存在,否则值为空-->
<br>
<br>
验证码:
<input name="ym" type="text" size="5">
<?phpif(!isset($_SESSION)){session_start();//启用会话}$array=array(1=>"pic/1.jpg",2=>"pic/2.jpg",3=>"piv/3.jpg",4=>"pic/4.jpg",5=>"pic/5.jpg");$rand="";for($i=0;$i<4;$i++){$rand.=rand(1,5)."|";//字符串变量$rand类似"4|3|1|1|"格式}$rands=explode("|",$rand);//将$rand字符串变量以"|"划分为一个个数组元素$rand=implode($rands);//将一个一维数组的值重新转化为字符串,此时,字符串变量$rand类似"4311"格式$_SESSION['ym']=$rand;//第一个Session变量:将验证码存储Session变量ym中for($b = 0;$b < 4;$b++){echo "<img src=pic/".$rands[$b].".jpg>";//利用数组随机输出4张4位数的验证码图片}
?><a href='index.php'>刷新</a> <br><br> &nbsp;&nbsp;<input type="submit" name="sub" value="注册" /><!--提交按钮2-->&nbsp;&nbsp;<input type="reset" name="res" value="重置" />
</form>
</body>
</html>

输出:

index_ok.php

<?phpif(!isset($_SESSION))//初始化SESSION变量{ session_start(); } if(!empty($_POST['check']) && $_POST['check'])//判断用户是否提交了检查按钮,empty()函数检查一个变量是否为空{//检查提交按钮1的提交信息:用户名信息是否被占用if($_POST["name"]==""){echo "<script>alert('用户名不能为空');location.href='index.php'</script>";}else if($_POST["name"]==$_COOKIE["name"])//若用户名与用户之前注册过$_COOKIE["name"]同值{echo "<script>alert('用户名被占用');location.href='index.php';</script>";}else//客户端要么没有该Cookie($_COOKIE["name"]),要么输入的用户名与$_COOKIE["name"]值不对应,此时需要在客户端设置Cookie{setcookie('name',$_POST ['name']);//没有传入第三个参数-Cookie有效期,当用户离开网站时该Cookie就会自动删除echo "<script>alert('用户名可用');location.href='index.php';</script>";}}if(!empty($_POST['sub']) && $_POST['sub'])//判断按钮的值,执行不同的操作,此处形式提交按钮需要执行的脚本{if($_POST['name']=="" || $_POST['pwd']=="" || $_POST['ym']=="")//判断注册信息是否为空{echo "<script>alert('注册信息不能为空');location.href='index.php'</script>";}if($_POST ['ym']==$_SESSION['ym'])//判断验证码是否正确,利用保存在服务器上的Session变量ym进行验证{setcookie('name',$_POST['name']);//由于提交按钮之前需要点击检查按钮验证是否是同一个用户,一般来说用户点击了提交就证明该用户是一个新用户,所以将用户名与密码以Cookie的形式保存在客户端setcookie('pwd',$_POST['pwd'],time()+60);//保证安全性,密码Cookie仅存在当前时间后的60秒echo "<script>alert('注册成功');window.location.href='main.php';</script>";}else{echo "<script>alert('验证码错误');</script>";}}
?>

注意:此此本不能缺少开始的几行,即初始化SESSION变量,Session的设置不同于Cookie,必须先启动,在PHP中必须调用session_start()函数,以便PHP核心程序将Session相关的内建环境变量预先加载至内存。session_start()有两个作用:一是开始一个会话,二是返回已经存在的会话。如果少了这一句,会在$_SESSION[‘ym’]这里出现逻辑错误,因为提取不出来Session变量ym的值,所以一直会报验证码错误。

main.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>用户注册成功!</h2>
<?phpecho "用户名:".$_COOKIE['name']."<br>";echo "密&nbsp;&nbsp;码:". $_COOKIE['pwd'];
?>
</body>
</html>

整体输出效果:


F:\WAMP_Environment\PHP7.1\tmp\sess_752b7jaio0rf49li7gu2oegh4p的内容如下:

前面的username以及password是我在上一个限制访问时间的例子中的index.php文件中加上了

$_SESSION["username"]="root";//注册Session变量,赋值为一个用户的名称
$_SESSION["password"]="123456";//注册Session变量,赋值为一个用户的密码

由此可见,Session会话具有针对性,一旦用户进入网站,准确的说用户在网站文档根目录(/)开始,往子目录不管访问哪个php文件,PHP始终会为用户标识唯一的、独立的Session对象,Session对象通过session_id属性进行标识,服务器标识用户浏览器以session_id进行标识,只要该用户访问了该站点下的任意一个可以增加Session变量(如上面的username以及password)的php文件,都会在PHP引擎的tmp目录下建立以该用户session_id命名的文件,里面存放该用户的相关信息。

使用Session可以存储用户信息,如姓名、访问时间、访问页面,以及每个页面的停留时间,通过这些基本信息能够统计出用户的浏览习惯、个人爱好等。在用PHP开发购物车网页时,也可以利用Session作为购物车,记录已选购的每件商品以及相关信息。

浏览器也可以查看服务器分配给客户端的SessionID:

利用Session控制不同用户的用户级别以实现用户权限管理

在一个网站中,不同用户拥有不同的权限。比如以论坛类网站来说,管理员用户登录,可以在网站上发布公告信息;如果以普通用户登录则不可以,只能浏览论坛中的帖子。

index.php为前后台页面,表单提交目的地也为index.php同时设置Session变量,然后再由该页面的PHP脚本控制跳转到main.php,再在该页面内提取已定义Session的值,根据不同的值显示不同的图片,此处以图片的形式简化操作。

index.php

<?php
if(!isset($_SESSION))
{ session_start();
}
if(  ! empty ( $_POST ['sub'] ) &&  $_POST['sub']==true)
{if($_POST['user']!="" && $_POST['pwd']!=""){if($_POST['user']=="admin" && $_POST['pwd']=="admin"){$_SESSION['type'] = 0;echo "<script>alert('管理员登录成功!'); window.location.href='main.php';</script>";}else{$_SESSION['type'] = 1;echo "<script>alert('普通用户登录成功!'); window.location.href='main.php';</script>";}$_SESSION['user'] = $_POST['user'];$_SESSION['pwd'] = $_POST['pwd'];}else{echo "<script>alert('用户名和密码不能为空!'); window.location.href='index.php';</script>";}
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>用户登录</h2>
<form action="" method="post">用户名:<input type="text" name="user"><br><br>密&nbsp;码:<input type="password" name="pwd"><br><br><input type="submit"name="sub"value="确 定">&nbsp;&nbsp;<input type="reset"name="res"value="重 置">
</form>
</body>
</html>

main.php

<?php
if(!isset($_SESSION)){ session_start();
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body><?php if($_SESSION['type']=="0"){?><img src="data:images/mes.jpg"><!--管理员用户具备发布公告信息功能的图片--><?php}else{?><img src="data:images/for.jpg"><!--普通用户只有浏览功能的图片--><?php}?>
</map>
</body>
</html>

还是要再次提醒,欲使用$_SESSION必须先执行session_start();语句。
输出:

此时F:\WAMP_Environment\PHP7.1\tmp\sess_752b7jaio0rf49li7gu2oegh4p显示为:

username|s:4:"root";password|s:6:"123456";ym|s:4:"1413";type|i:1;user|s:2:"12";pwd|s:2:"12";

Session实现网站防刷计数器

在网站需要统计页面访问次数的时候,常常需要排除一些不符合要求的情况,比如说用户利用浏览器不断刷新页面,以提高访问次数的情况,接下来就是要解决这种情况。


首先创建counter.txt保存网站之前访问量,再客户端浏览器没有浏览访问index.php时,counter.txt的内容为:

579

index.php

<?php
if(!isset($_SESSION)){ session_start();
}
if(!isset($_SESSION['temp']))//判断$_SESSION[temp]==""的值是否为空,其中的temp为自定义的变量
{ if(($fp=fopen("counter.txt","r"))==false){ echo "打开文件失败!";}else{ $counter=fgets($fp,1024);  //读取文件中数据fclose($fp);                    //关闭文本文件$counter++;                     //计数器增加1$fp=fopen("counter.txt","w");   //以写的方式打开文本文件fputs($fp,$counter);            //将新的统计数据增加1fclose($fp);    }                       //关闭 $_SESSION['temp']=1;      //登录以后,$_SESSION[temp]的值不为空,给$_SESSION[temp]赋一个值1
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>防刷计数器</h2>
<?php
//输出数据库中的记录数
if(($fp=fopen("counter.txt","r"))==false){echo "打开文件失败!";
}else{$counter=fgets($fp,1024);//从文件中读取一行fclose($fp);echo "网站的访问量:$counter";  //输出中文字符
}
?>
</BODY>
</html>

接着浏览器访问该页面,输出:

第一次访问时,计数器加一,即counter.txt文件的内容加一。此时不管怎么刷新,都只是580,因为我们修改counter.txt文件的前提是当前Session变量是否有值(此处我们设置为1),在我们第一次访问该页面时,服务器就已经给该浏览器分配了唯一的SessionID,并且设置了Session变量temp,可以在F:\WAMP_Environment\PHP7.1\tmp(我的目录下)查看:
服务器端

内容为:

temp|i:1;

客户浏览器端


我们重新打开浏览器,再次访问相同URL,服务器重新给浏览器端分配了一个新的SessionID,表示启动一个新的会话,此时Session变量temp不存在,计数器加一。
服务器端

客户浏览器端

Session实现设计网页换肤

在访问某些网站中,有些用户可以根据自己的喜好进行换肤,用户单击网页背景色,然后将参数保存到客户端Cookie或者浏览器Session,下一次再访问该网站时就可以根据上次设置的信息进行用户个性化的设置。

images文件夹下是一张宽度为240像素,高度为89像素的图像:

index.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
</style>
</head>
<?php
if(!isset($_SESSION)){session_start();
}
if(!empty($_GET['col'])){$_SESSION['bgcolor']=$_GET['col'];
}
?>
<body bgcolor="<?php if($_SESSION['bgcolor']==""){echo "white";}else{echo $_SESSION['bgcolor'];}?>">
<h2>选择一种背景色</h2>
<img src="data:images/1.jpg" width="240" height="89" border="0" usemap="#Map">
<map name="Map" id="Map"><area shape="rect" coords="4,3,27,26" href="index.php?col=0066FF"><area shape="rect" coords="30,3,58,26" href="index.php?col=0099ff"><area shape="rect" coords="64,3,87,26" href="index.php?col=00CCFF"><area shape="rect" coords="90,3,114,26" href="index.php?col=00ffff"><area shape="rect" coords="122,3,147,26" href="index.php?col=3300ff"><area shape="rect" coords="151,3,177,26" href="index.php?col=3233ff"><area shape="rect" coords="180,3,211,26" href="index.php?col=3366ff"><area shape="rect" coords="211,3,239,26" href="index.php?col=3399fe">
</map>
</body>
</html>

代码释疑:
HTML <map> 标签用于客户端图像映射,图像映射指带有可点击区域的一幅图像。在<img>标签中的usemap属性指定map标签的ip或者name属性,以建立<img>与<map>之间的关联,通过点击某块area热区,进行待查询字符串的URL跳转,此处还是跳转回本页面,只不过多了一个col参数(参数以及值显示在浏览器地址栏中必定是get请求),接着,在本页面中使用PHP预定义变量$_GET[‘col’]获取参数值,存放到当前Session会话的关联变量’bgcolor’中。此处还需要注意的是怎么获取每个<area>的coords属性的值,此处我使用了photoshop的功能,具体可以参考https://blog.csdn.net/weixin_42124234/article/details/103011873

输出:

注意:我们在index.php只实现了第一行的8个色块的热区跳转。此处我们单击第一行第一个色块,浏览器地址栏后增减:

?col=0066FF

表示提交给当前页面一个参数,利用PHP脚本的$_GET[]方法获取内容,并保存在当前Session文件夹:


内容为:

bgcolor|s:6:"0066FF";

此时服务器Session保存了当前颜色信息,接着我们在当前Chrome浏览器新开一个标签页面输入同样的URL,注意不是关闭浏览器再重新打开,输入相同URL访问,即使不加url查询字符串参数(url?xxxx=xxx),仍是显示上一个颜色设置页面。如果关闭浏览器再打开,则重新对浏览器客户端分配一个新的SeesionID,即开启一个新的会话,之前设置的Session变量bgcolor只是关联之前的SessionID。所以页面颜色显示为初始的白色。

Session的存在的生命期设置于php.ini文件中:

根据官方文档的解释为:

管理服务器端Session缓存

当第一次浏览网页后,页面的部分内容在规定的时间内就被存储在客户端的临时文件夹中,这样下次再访问相同的页面时,就可以直接读取缓存中的内容,从而提高网站的浏览效率。但若不定期处理浏览器的页面缓存文件,则会影响浏览器的运行速度以及客户端电脑的存储容量。同理,如果不对服务器端的Session缓存文件做定期清理,也会给服务器的运行带来压力。

此处的tmp文件夹用来代替php引擎的默认Session文件夹,也就是我本地的

F:\WAMP_Environment\PHP7.1\tmp

index.php

<?php
$path =  './tmp/';   //定义缓存文件的临时存储路径
session_save_path($path);  //设置缓存存储路径
session_cache_limiter('private');  //设置缓存方式
$session_cache = session_cache_limiter(); //开启缓存
session_cache_expire(30);     //定义缓存时间
$session_expire = session_cache_expire(); //设置缓存时间
if(!isset($_SESSION)){ session_start();
} //初始化SESSION变量
$_SESSION['cache'] = $session_cache;   //为SESSION变量赋值
$_SESSION['expire'] = $session_expire;
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h2>清理缓存</h2>
<?php
echo "<p>缓存限制为:<span style='color:red;font-size:30px'>".$session_cache."</span></p>";
echo "<p>缓存时间为:<span style='color:red;font-size:30px'>".$session_expire."</span>分钟</p>";
echo "<a href = 'index.php?cache=1'>清理缓存</a>";
if( ! empty( $_GET['cache'] ) && $_GET['cache'] == "1"){$_SESSION = array();session_destroy();echo "<script>alert('清理SESSION缓存成功');</script>";
}
?>
</body>
</html>

代码释疑:
(1)、session_cache_limiter ([ string $cache_limiter ] ) : string
参数cache_limiter用于设置缓存方式,其取值如下:

  • nochache:不设置缓存
  • private:私有方法
  • private nochache:私有方法,但不过期
  • public:公有方法

(2)、session_cache_expire ([ string $new_cache_expire ] ) : int
参数new_cache_expire为可选参数,设置SESSION的过期时间,单位为分钟。默认过期时间180分钟,即不设置参数的情况。

(3)、session_save_path ([ string $path ] ) : string
在服务器中,如果将所有用户的SESSION内容都保存在默认的临时文件夹中,会降低服务器的安全性(若黑客破解远程连接到你的电脑,找到大家都知道的默认文件夹,修改某用户的Session值,特别是Session中保存某用户购物车的情况)和效率(保存Session的默认文件夹存储在PHP引擎的文件夹下,若文件过大,则拖慢PHP的运行效率,打开服务器存储的站点会非常慢。)因此我们重新建立了一个tmp文件夹。

输出情况:
Chrome浏览器打开

同时在我们自定义的tmp目录下:


此时我们点击清除缓存超链接,我们自定义的tmp目录下针对当前会话的session文件被删除了,对应index.php代码第28行。

PHP笔记:Cookie和Session应用相关推荐

  1. PHP5 GD,验证码笔记 COOKIE,SESSION

    [GD] 在php.ini  (这个你必须知道) extension=php_gd2.dll 这一项要打开  phpinfo(); 安放位置  php 所有的扩展模块  (知道就行了别记,看一眼) C ...

  2. Cookie和Session-学习笔记04【Session之验证码案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] Cookie和Session-学习笔记01[Cookie_快速入门.Cookie_细节] Cookie和Session-学习笔记02[Cookie案例 ...

  3. Cookie和Session-学习笔记03【Session快速入门、Session细节】

    Java后端 学习路线 笔记汇总表[黑马程序员] Cookie和Session-学习笔记01[Cookie_快速入门.Cookie_细节] Cookie和Session-学习笔记02[Cookie案例 ...

  4. javaweb入门笔记(5)-cookie和session

    2019独角兽企业重金招聘Python工程师标准>>> javaweb入门笔记(5)-cookie和session 标签: javaweb [TOC] Cookie是客户端技术:Se ...

  5. 完全PHP5笔记之(COOKIE与SESSION篇)

    最近发现写博客也是提高 学习 效率的有效途径之一.好记性不如烂笔头,归纳总结时,你会发现总有一些东西你认为很熟了,它却在细微处讽刺你的错误.我学习COOKIE与SESSION 时,几乎把社区所有相关的 ...

  6. 爬虫课程笔记(二)Requests、代理、cookie和session

    爬虫课程笔记 Requests 使用入门 Requests作用 发送简单的请求 content和text 区别 发送带header的请求 发送带参数的请求 发送POST请求 贴吧爬虫案例 使用代理 c ...

  7. 【学习笔记】cookie、session、token和分布式session

    文章目录 cookie和Session session和token cookie和token总结 分布式Session cookie和Session 为什么要有session的出现? 答:是由于网络中 ...

  8. Cookie与Session相关学习笔记

    一.会话技术 会话: 为了实现某一个功能, 浏览器和服务器之间可能会产生多次的请求和响应, 从浏览器访问服务器开始, 到最后浏览器关闭, 这期间产生的多次请求和响应就称之为浏览器和服务器之间的一次会话 ...

  9. Web后端学习笔记 Flask(9)cookie and session

    Flask_wtf除了可以做表单验证,模板渲染之外,还可以防御CSRF攻击.要了解CSRF攻击的原理,首先需要了解cookie和session的知识点. cookie:在网站中,HTTP请求是无状态的 ...

  10. 【读书笔记】深入分析Java Web技术内幕-Cookie与Session

    1. cookie a. cookie的属性项(version1)i. NAME=VALUEii. versioniii. comment--注释项iv. commentURL--服务器为此cooki ...

最新文章

  1. Python学习笔记17:标准库之数学相关(math包,random包)
  2. cat、head、tail、more和less命令(文件内容浏览)
  3. 在QT搭建的播放器外壳中嵌入SDL的窗口
  4. DCMTK:生成一个C ++标头,为DICOM标签定义符号名
  5. ant design vue input change_vue中关于$emit用法的笔记
  6. 在 Linux 下使用 RAID(二):使用 mdadm 工具创建软件 RAID 0 (条带化)
  7. hihoCoder 1116 计算 (线段树)
  8. openjdk7的ImageIO.read()导致jvm异常crash
  9. 栈的典型应用 —— 逆序输出
  10. 基于Springboot的理财系统
  11. 用算法判断输入的一个数是几位数
  12. 密钥管理——密钥生命周期管理
  13. [Mysql] ROUND函数
  14. [转]应对新劳动法:华为万名员工“自愿”辞职[http://news.qq.com/a/20071030/001675.htm]
  15. 实测超轻量中文OCR开源项目,总模型仅17M
  16. 7 索引,视图,同义词,序列,表空间
  17. SpringBoot整合liquibase
  18. 企微企鲸客SCRM管理系统可以为销售提供哪些辅助
  19. 群晖DS918+ 二合一 分区扩充教程
  20. 低代码指南100解决方案:92智能化设备巡检管理系统6大优势,助你轻松解决设备管理难题

热门文章

  1. SAP-PP MRP再计划/重新计划
  2. RabbitMQ中重试机制的坑
  3. CSMA/CD中重传与冲突检测机制
  4. 真实揭秘·程序员个人兼职在威客外包平台究竟赚钱否
  5. 408计算机组成原理有哪几题,2019考研408计算机组成原理选择题及答案(3)
  6. 2020中国超级计算机排名第一,最新top500超级计算机榜单 全球超级计算机榜单2020新一期:中国部署数量世界排名首位...
  7. 【视音频编程学习】FFmpeg十个常用命令 || pcm与wav、amr、aac、mp3互转
  8. 中国工程机器人大赛暨国际公开赛(RoboWork)
  9. Chrome OS与Windows
  10. 水晶报表Crystal Reports XI服务器版