您的位置:首页 > 其它

吐血推荐cookie和session

2017-03-06 11:20 253 查看


吐血推荐cookie和session

很多人对于cookie和session一知半解,今天我们就全面透彻的分析一下cookie和session的原理和使用以及注意事项。


*写在前面

我们的网页访问都是通过http协议实现,http是一个无状态协议,说白了就是一个用户请求一个页面后,再请求同一网站上的另外一个页面时,http协议并不认为两次请求是来自同一用户,也就是http协议没有一个内建机制来维护两个事务之间的状态。这种尴尬的局面应该如何逆转,没错,cookie和session就是专为此应用而生。



一、cookie

Cookie是用来将网站的资料信息记录在客户端(用户电脑中)的一种技术。下面就举个十分重要的例子,当我们访问一个网页时,通过服务器端认证后,服务器中的程序会把用户信息设置到我们电脑的CooKie中,注意了,当我们再次访问这个网站的其他脚本时,浏览器会自动携带Cookie中的数据一起访问,在服务器端的每一个脚本都可以接受Cookie中的数据,不需要每访问一个页面就得重新验证一次。 

接下来我们就开始从程序上详细解读Cookie。 

1、向客户端电脑中设置Cookie 

setcookie(name,value,expire,path,domain,secure); 

比如我们向客户端电脑中设置‘name’为‘郭润生’,‘email’为‘Rision666@163.com’,过期时间为3600秒(1个小时)程序如下:

<?php
header('Content-type:text/html;charset=utf-8');
setcookie('name','郭润生',time()+3600);
setcookie('email','Rision666@163.com',time()+3600);

运行本程序后,我们就成功地向客户端电脑中设置了Cookie,而后当我们再次从同一没关闭的浏览器中访问该服务器上(网站)的脚本时,浏览器会自动携带该Coolie内容,所以我们再新建一个文件夹,然后直接读取由浏览器传过来的额Cookie值,这个Cookie值存到哪里了呢?没错,超级全局变量$_COOKIE中,访问Cookie值程序如下:

<?php
header('Content-type:text/html;charset=utf-8');
var_dump($_COOKIE);
?>

很显然,我们顺利地访问到了Cookie中的值。 

2、有时候我们想把同一个人的信息存储到一个变量中,即多维数组应用于cookie中,现在我们改写上面的程序


程序如下:

<?php
header('Content-type:text/html;charset=utf-8');
var_dump(setcookie('member[name]','郭润生',time()+3600));
var_dump(setcookie('member[email]','Rision666@163.com',time()+3600));
?>

3、销毁Cookie 

有设置Cookie就有销毁Cookie,销毁Cookie语法如下: 

setcookie(“name”,”,time()-1);这里将cookie的过期时间设置为当前时间的前一秒,当然你可以设置为前N秒。 

程序运行结果如下:

<?php
foreach ($_COOKIE['member'] as $key=>$val){
var_dump(setcookie("member[{$key}]",'',time()-3600));
}
?>

注意:使用setcookie删除cookie的时候,需要与当初设置cookie的时候参数一致!(关于这个将在session中介绍)


二、session

Session技术与Cookie相似,都是用来存储使用者的相关资料,但是他们最大的不同是Cookie是将资料信息存储在客户端的电脑中,而session则是将数据存放于服务器上。把保存的资料比喻为健身房中的会员卡,Cookie技术相当于需要自己保存会员卡,会员卡中包含有自己所有的资料信息,每次去健身房时都需要持会员卡进健身房,而Session技术就相当于会员卡由健身房保存,每次来健身房的时候只需要报出会员卡卡号(我们暂称之为session_id,客户端的cookie中只需要保存session_id)即可,由此看来,session的实现需要cookie支持,关于禁用cookie实现session的策略我们以后介绍,接下来我们详细解读session。 

1、开启session 

session_start(); 

1)开启一个会话(一个健身爱好者去健身房健身 办会员卡) 

2)打开已经存在的会话(当客户以后再到健身房健身的时候,根据上次办理的卡号 验证该顾客是会员。即根据客户端传递过来的session_id把这个session_id对用的数据读到$_SESSION超级全局变量中)。
2、使用session存储数据 

向session中存数据,其语法就是想超级全局变量$_SESSION中压入数据,比如我们需要将上面Cookie中的数据压入到session中,语法如下

<?php
header('Content-type:text/html;charset=utf-8');
session_start();
$_SESSION['name']='郭润生';
$_SESSION['email']='Rision666@163.com';

运行这个程序,我们干了两件事,第一为用户开启一个session并把数据压到session变量中,第二向客户端cookie中传递了一个session_id值。然后我们可以验证一下,是否有session和cookie,我们知道访问同一网站的不同脚本都会携带该cookie,所以我们可以在另一个页面中将该cookie打印出来,程序如下:

header('Content-type:text/html;charset=utf-8');
session_start();
var_dump($_SESSION);
var_dump($_COOKIE);
?>

经验证,我们得到了session中和cookie中的数据。 

3、注销变量与销毁session

<?php
session_start();//打开要销毁的会话!
session_unset();//Free all session variables
session_destroy();//销毁一个会话中的全部数据
setcookie(session_name(),'',time()-3600,'/');//销毁保存在客户端的卡号(session id)
?>

这里解释一下{注意:使用setcookie删除cookie的时候,需要与当初设置cookie的时候参数一致!}我们在销毁session时,到session_destroy()后就可以了,这里我们就删除掉了服务器端的session文件,这个文件可以通过php.ini配置,默认在tmp文件夹下,我们看到该文件夹下文件的命名,没错就是session_id,也就是cookie传过来的值,或许前面有一个前缀sess_。接着说上面的,删除这个文件后,即使用户拿着session_id过来,我们也不认识它,cookie中的session_id在关闭浏览器后会自动销毁。 

有关于session和cookie的配置文件php.ini大家可以浏览一下。 

注意:同一用户,不同浏览器,服务器视为不同用户。


禁用Cookie后Session该如何传递

先提两个思路,第一是通过隐藏表单传递,第二是通过http协议的头部(URL重写)。

<form name="testform" action="/xxx">
<input type="hidden" name="sessionid"
value="ka5g95v4ekh92503nd9abg6553″>
</form>

URL重写:
http://www.×××.com/test?sessionid=ka5g95v4ekh92503nd9abg6553 

具体详细教程以后有时间附上!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息