大部分的人都知道Cookie,但是可能不了解Session,现在对这两者进行解释。
问题的提出:
有些网站会提示用户在一定的时间之内免登陆,这是用的什么技术?答案是Cookie技术。
有些购物网站会提示用户将物品放入购物车之后在不购买就会自动删除物品,这是用的什么技术?答案是Session。
PHP作为一门服务器脚本语言,对这两种技术做了详细的说明。
在介绍之前应当说明会话的概念:
所谓会话,通俗的理解就是打开浏览器,访问某个网站的很多页面(通过点击超链接完成),关闭浏览器后,一个会话就结束了。
会话和cookie和session都有着密切的关系。
一、Cookie
Cookie是保存在客户端的一些文件。文件中可能记录着用户的用户名和密码,视频播放的进度或者其它信息。
PHP中,保存的Cookie是一个个的键值对,还有时间。
1.1保存Cookie:
setCookie(name,value,time);
举例:setCookie("username","zhangsan",Time()+3600);这句话的意思就是将名字为username,值为zhangsan的信息保存在文件中,时间是当前时间+3600s,就是说3600s之后就会失效。
1.2查看Cookie:
$cookie=$_COOKIE['name'];//$_COOKIE是九种预定义超全局数组中的一种
1.3删除Cookie:
1.3.1删除指定的键值对。
setCookie("username","",Time()-1);//只要是-号就可以
1.3.2删除所有的键值对
使用for循环
foreach($_COOKIE as $key=>$val)
{
setCookie($key,"",time()-100);
}
1.4Cookie的生命周期
如果不指定时间,那么Cookie的生命周期默认为一次会话结束之后就自动结束,即清空Cookie。
1.5Cookie支持中文吗?
Cookie支持中文,只是在保存的时候,使用了urlencode编码,在文件中看到的是乱码;读取的时候自动使用urldecode解码,恢复正常。我们可以使用urldecode方法手动验证。
1.6在查看上次登录时间的时候发现相差8个小时
使用的是格林尼治时间,和北京时间相差8个小时,所以要修改默认时区,修改方法:
方案1:在php文件中设置。
date_defult_timezone_set("Asia/Chongqing");
方案2:在php.ini文件中设置。
使用timezone查找,设置为Asia/Chongqing。
1.7小案例
setCookie.php
1 <?php 2 header("content-type:text/html;charset=utf-8"); 3 setCookie("name","张三",Time()+15); 4 setCookie("age","21",Time()+3600); 5 setCookie("password","5a6f38",Time()+7200); 6 echo "Cookie保存成功!"; 7 ?>
showCookies.php
1 <?php 2 header("content-type:text/html;charset=utf-8"); 3 echo "<pre>"; 4 print_r($_COOKIE); 5 echo "</pre>"; 6 echo "<br/>"; 7 $name=$_COOKIE['name']; 8 if(!empty($name)) 9 { 10 echo "name={$name}"; 11 } 12 else 13 { 14 echo "cookie已经失效!"; 15 } 16 ?>
二、session
什么是session?
session是一中服务器端的技术,这种技术将用户的相关信息保存到了服务器端的文件。
问题的提出:
思考问题:
问题1:我们在浏览网站,去购物的时候,张三和李四,可以购买不同的商品,并且在查看购物车的时候,可以看到各自购买的商品。这该怎么实现?
思路:
1.数据库。
分析:代价高昂,不可行。
2.cookie
安全性不高/在网络传数据(产生带宽的问题)。
3.解决之道->session
问题2:
网站安全性的问题?
用户无需登录就可以到我们的管理页面,并且可以对用户进行增删改查 crud操作。
这个漏洞用session来解决。
2.1添加操作。
session_start();//这个动作如果是在会话除,会创建一个文件,保存在服务器端,如果已经在会话中了,则不会再创建。
$_SESSION['name']=value;
所以session中保存的也是键值对,保存的时间需要到php.ini中修改。
2.2修改操作。
和添加操作相同。
2.3删除操作。
2.3.1删除指定的键值对。
unset($_SESSION['name']);
2.3.2删除所有的键值对,同时也会删除文件。
session_destroy();
2.4查找操作。
$session=$_SESSION['name'];
2.5支持的数据类型
支持所有的数据类型,包括数组、对象。
2.6生命周期。
session的生命周期又称为发呆时间,PHP中默认为1440s,一旦超过这个时间而不用,数据将会自动被删除;一旦开始用,即使是最后一秒也会重新开始计算。
修改方法:到php.ini文件中修改。
搜索项:session.gvc_maxlifetime=1440
2.7session文件的保存路径。
可以自定义路径,修改方法:
在php.ini文件中查找session.save_path,修改后重启Apache即可。
2.8总结session的用处:
session可以用来做什么事情?
2.8.1.网上商城中的购物车
2.8.2.保存登录用户的信息
2.8.3.将某些数据放入到session中,共同一用户的各个页面使用
2.8.4.防止用户非法登录到某个页面。
2.9session使用的注意事项。
使用session必须初始化。即session_start();
也可随意在php.ini文件中配置session.auto_start=1,但是不推荐。
2.10为什么在一个会话未结束之前,可以使用多个不同的网页访问同一个session文件?
第一次创建session的时候,会自动创建一个cookie文件,告诉浏览器session文件的名称,浏览器在向服务器发送请求的时候会自动带上Cookie信息。
2.11Cookie禁用后,如何使用session
为什么禁用Cookie之后无法使用session?
原因:禁用cookie之后,浏览器无法接受服务器的set cookie,无法获取sessionid
解决方法:
方法1:
使用$sid=session_id();方法获取当前session文件的id号,并且使用
$sid=$_GET['sessionid'];
if(!issert($sid))
{
session_id($sid);
}
session_start();
确认是否需要新建session文件。
方法2:
使用全局变量SID,这将会简化上一种方法的操作。
方法3:
配置PHP文件。
session.use_trans_sid指定是否启用session透明支持。
如果设置true,则在使用header重定向或者超链接的时候,就会自动拼接SID
注意,使用js实现页面跳转的时候,不会自动拼接,需要手动指定。
2.12session小案例。
网上购物:
MyHall.php:程序入口
1 <?php 2 echo "<h1>欢迎来到购物商城</h1>"; 3 echo "<br/><br/>"; 4 echo "<a href='ShopProcess.php?bookid=sn001&bookname=红楼梦'>红楼梦</a><br/><br/>"; 5 echo "<a href='ShopProcess.php?bookid=sn002&bookname=西游记'>西游记</a><br/><br/>"; 6 echo "<a href='ShopProcess.php?bookid=sn003&bookname=三国演义'>三国演义</a><br/><br/>"; 7 echo "<a href='ShopProcess.php?bookid=sn004&bookname=水浒传'>水浒传</a>"; 8 echo "<br/><hr/>"; 9 echo "<a href='ShowCart.php'>查看购买的商品</a><br/><br/>"; 10 echo "<a href='DelCart.php'>删除购买的商品</a>"; 11 ?>
DelCart.php:清空购物车
1 <?php 2 session_start(); 3 session_destroy(); 4 echo "删除全部商品成功!<br/><br/>"; 5 echo "<a href='MyHall.php'>返回购物界面</a>"; 6 ?>
ShopProcess.php:接收请求并重定向
1 <?php 2 //初始化session 3 $bookid=$_GET['bookid']; 4 $bookname=$_GET['bookname']; 5 //echo "$bookid:$bookname<br/>"; 6 session_start(); 7 $_SESSION["{$bookid}"]=$bookname; 8 echo "购买成功!<br/><br/>"; 9 echo "<a href='MyHall.php'>返回继续购买</a>"; 10 ?>
ShowCart.php:查看购物车
1 <?php 2 //初始化session 3 session_start(); 4 //取出session中的内容,利用数组循环遍历 5 print_r($_SESSION); 6 echo "<br/><br/>"; 7 foreach($_SESSION as $key=>$val) 8 { 9 echo "书号:$key 书名:$val<br/><br/>"; 10 } 11 echo "<a href='MyHall.php'>返回购物界面</a>"; 12 ?>
案例二:代码演练:并非小项目,需要单独运行。
save.php:保存数据
1 <?php 2 //现在开始演示怎样保存数据到session文件 3 require_once 'Dog.class.php'; 4 //1.初始化session 5 session_start(); 6 echo "当前session文件的ID号是:".session_id()."<br/>"; 7 //2.保存数据。 8 $_SESSION['name']="张三"; 9 $_SESSION['age']=123; 10 $_SESSION['isboy']=false; 11 $_SESSION['salry']=15000.00; 12 $_SESSION['array']=array("你好",123,456.0,false); 13 $dog=new Dog("小狗",12,"boy"); 14 $_SESSION['dog']=$dog; 15 16 echo "保存成功!"; 17 18 ?>
del.php:删除数据
1 <?php 2 /* 3 这是专门针对删除session的操作 4 */ 5 //引入文件 6 require_once 'Dog.class.php'; 7 //session初始化 8 session_start(); 9 echo "当前session文件的ID号是:".session_id()."<br/>"; 10 //删除方法1:只删除一个元素 11 //举例:只是删除姓名:name 12 unset($_SESSION['name']); 13 echo "删除姓名之后的结果是:<br/>"; 14 show(); 15 //全部删除 16 session_destroy(); 17 echo "<br/><br/>删除所有session数据之后:<br/>"; 18 show(); 19 20 function show() 21 { 22 echo "当前session文件的ID号是:".session_id()."<br/>"; 23 echo "<pre>"; 24 print_r($_SESSION); 25 echo "</pre>"; 26 27 echo "<br/><br/>"; 28 echo "显示姓名:".$_SESSION['name']."<br/>"; 29 echo "显示年龄:".$_SESSION['age']."<br/>"; 30 echo "显示判断:".$_SESSION['isboy']."<br/>"; 31 echo "显示薪水:".$_SESSION['salary']."<br/>"; 32 echo "显示数组:<br/>"; 33 $array=$_SESSION['array']; 34 foreach($array as $key=>$val) 35 { 36 echo $key."=>".$val."<br/>"; 37 } 38 echo "<br/>"; 39 40 echo "显示对象:<br/>"; 41 $dog=$_SESSION['dog']; 42 echo "小狗的名字是:".$dog->getName()."<br/>"; 43 } 44 ?>
Dog.class.php:类文件
1 <?php 2 class Dog 3 { 4 private $name; 5 private $age; 6 private $sex; 7 public function __construct($name,$age,$sex) 8 { 9 $this->name=$name; 10 $this->age=$age; 11 $this->sex=$sex; 12 } 13 public function getName() 14 { 15 return $this->name; 16 } 17 } 18 ?>
modify.php:修改数据
1 <?php 2 //引入文件 3 require_once 'Dog.class.php'; 4 //初始化session 5 session_start(); 6 echo "当前session文件的ID号是:".session_id()."<br/>"; 7 //现在将姓名改为郑纪佳,并显示。 8 $_SESSION['name']="李四"; 9 echo "将姓名改为李四之后的结果是:<br/>"; 10 show(); 11 12 function show() 13 { 14 echo "<pre>"; 15 print_r($_SESSION); 16 echo "</pre>"; 17 18 echo "<br/><br/>"; 19 echo "显示姓名:".$_SESSION['name']."<br/>"; 20 echo "显示年龄:".$_SESSION['age']."<br/>"; 21 echo "显示判断:".$_SESSION['isboy']."<br/>"; 22 echo "显示薪水:".$_SESSION['salary']."<br/>"; 23 echo "显示数组:<br/>"; 24 $array=$_SESSION['array']; 25 foreach($array as $key=>$val) 26 { 27 echo $key."=>".$val."<br/>"; 28 } 29 echo "<br/>"; 30 31 echo "显示对象:<br/>"; 32 $dog=$_SESSION['dog']; 33 echo "小狗的名字是:".$dog->getName()."<br/>"; 34 } 35 ?>
show.php:显示数据
1 <?php 2 require_once 'Dog.class.php';//这句话不能省略,非常重要,因为如果没有这句话,就不能显示对象内容 3 //加载session 4 session_start(); 5 //显示当前会话的内容。 6 function show() 7 { 8 echo "当前session文件的ID号是:".session_id()."<br/>"; 9 echo "<pre>"; 10 print_r($_SESSION); 11 echo "</pre>"; 12 13 echo "<br/><br/>"; 14 echo "显示姓名:".$_SESSION['name']."<br/>"; 15 echo "显示年龄:".$_SESSION['age']."<br/>"; 16 echo "显示判断:".$_SESSION['isboy']."<br/>"; 17 echo "显示薪水:".$_SESSION['salary']."<br/>"; 18 echo "显示数组:<br/>"; 19 $array=$_SESSION['array']; 20 foreach($array as $key=>$val) 21 { 22 echo $key."=>".$val."<br/>"; 23 } 24 echo "<br/>"; 25 26 echo "显示对象:<br/>"; 27 $dog=$_SESSION['dog']; 28 echo "小狗的名字是:".$dog->getName()."<br/>"; 29 } 30 show(); 31 ?>
三、比较Cookie和session