关于session和cookie

这两天看视频基本都是在看关于session和cookie的一些东西,其实关于session和cookie说简单很简单,两者都是用来记录用户信息的,session是服务器端,cookie是存放在客户端(浏览器)!说完==!不过其实这里面需要注意的地方很多。
 
    首先来说一下cookie,上面已经说了,cookie是存放在客户端,也就是浏览器,那么应该怎么来理解cookie的工作原理呢,视频里面燕老师讲了一个生活中的例子我觉得十分好:一群人去买豆浆,开始他们也不排队,乱哄哄的,而老板又必须先收了钱才肯给豆浆,那么豆浆又要是现磨的,譬如张三去买豆浆,先给了钱说要一杯大的,老板把钱收下来了,让张三到一边等去,但是老板十分健忘,豆浆磨出来了,张三来取,糟了,忘记了张三到底是买多少了,也忘记了张三到底有没有先给钱,后来老板想出了一个办法,当有人来买豆浆付钱的时候,老板就给张三一张小纸条,上面写着买豆浆的信息,等豆浆磨出来了,张三就拿着这纸条来取,那么就算老板多健忘,也不会乱了。那么,顾客就是客服端(浏览器),老板也就是服务器,这个小纸条也就是cookie了。当浏览器在访问某个页面的时候,可以向服务器申请说,我需要记录这个信息,然后服务器就会给您记录下来这个信息返还给你拿着,然后下次你需要来这个页面用验证的时候就可以直接拿出这个cookie出来,免去了很多麻烦,那么在PHP中,cookie具体是如何使用的呢,很简单,使用下面这个函数 bool setcookie ( string $name [, string $value [, int $expire =0 [, string $path [, string$domain [, bool $secure =false [, bool $httponly= false ]]]]]] )
这个函数虽然看起来很多参数,但是一般我们使用的也就前面两三个,第一个也就是这个cookie的名字,第二个cookie的值,这两个都比较好理解,第三个是cookie的有效期(可选),有效期的意思就是设置这个cookie什么时候失效,当不设置的时候,页面关闭,cookie就会失效,如果设置,就是按照时间戳来计算,例如我要设置一个24小时后失效的cookie,这里就可以直接用time()+24*3600,后面三个参数一般很少用到这里也就不详述了,其实我也不是很了解--!那么,cookie是怎么读取的呢,在PHP对于cookie的读取是十分简单的,直接使用超级全局变量$_COOKIE[]直接读取就可以了,那么cookie的删除要怎么删除呢,一般我们不直接删除cookie,而是设置它的有效期为过期(也就是time()或者更早的时间),那么这个cookie也就失效了。这里需要注意几个地方,第一:cookie是设置为数组或者对象,只能设置为字符串等,第二:cookie是无法重新赋值,也就是说说,我这种操作是错误的:$_COOKIE[]=XX;这样是不允许的。第三:cookie的作用域默认只在同级目录以及子目录下面有效,如果想在非根目录下面设置整个网站都有效的cookie的话,就要使用到第四个参数了,将其设置为'/',就可以在全局内使用了,但是cookie是无论如何都无法跨域名的。下面用一个小例子来练习一下cookie。
<?php
$url = $_SERVER['REQUEST_URI'];//获取当前url
if(!isset($_COOKIE['history'])){
    //第一次的时候直接将其放进数组
    $his[] = $url;
}else{
    //第n次的时候,先把cookie字符串转化为数组,然后把当前的url再放进数组里面
    $his = explode('|',$_COOKIE['history']);
    array_unshift($his,$url);
    //去数组中的重复数值
    $his = array_unique($his);
    //判断数组是否超过10个,超过10就把第一个弹出
    if(count($his) > 10){
        array_pop($his);
    }
}
//将数组转化为字符串放入cookie里面
setcookie('history',implode('|',$his));
$id = isset($_GET['id'])?$_GET['id']:0;
print_r($_COOKIE);
?>
<p>
    <a href="01.php?id=<?php echo $id-1 ?>">上一页</a> <br />
</p>
<p>
    <a href="01.php?id=<?php echo $id+1 ?>">下一页</a> <br />
</p>
<?php
foreach ($his as $v){
    echo $v,'<br />';
}
?>

这是一个使用cookie来记录浏览历史的页面,里面巧妙的使用了$_GET来获取当前的$id,然后制造个无限循环个上下页来用于测试,然后没生成一个浏览页面的时候,我们都将其保存在cookie里面,这里用一个小技巧来避开cookie无法保存字符的问题,我们把URL保存在字符串中,然后用'|'来隔开各个URL,当需要使用的时候再用explode来将起分为数组来循环输出。具体可以看代码就不一一详述了。
 
   
      说完了cookie,接下来我们就来说一下session了,那么为什么要使用session呢,cookie不是已经可以满足我们的要求了么,没错,cookie是很方便,但是因为cookie是存放在客户端的,这就很容易产生一个安全性的问题了,无论是谁,都可以轻易去修改cookie,就好像上面的例子,我买豆浆给钱的时候,我说要一杯小的,别人给我一张写着一杯小的小纸条,然后我拿到以后偷偷的将这张纸条改为10杯大的,那么再去老板那边拿豆浆,老板岂不是亏死了,所以,基于安全性考虑,我们就引入了session,session为什么就安全了呢,上面已经说过了,因为session是保存在服务器的,同样使用上面买豆浆的例子,老板发现这样不好,整天有人本来是买一杯的后来变成了十杯八杯的,老板又想出来一个方法,你给钱的时候,我自己拿一个本子记下来你买了多少杯,然后就随便给你一个数字,再在本子里面把这个随机数和你买的东西记在一起,下次你就拿着这个记着这个随机数的纸条来取豆浆,这次总不会错了吧。在这里例子中,显而易见,那个随机数小纸条就是session了。有了上面cookie的经验,session就简单很多了,有一个很重要需要注意的地方,就是,每次页面要使用session的时候(无论是读取,设置,删除),我们都必须先session_start()先,而且要在页面的最前面。当然,我们也可以进入php.ini里面设置默认开启session(具体可以百度),但是不建议这样做。我们上面一直说,session是存放在服务器的,但是具体存放在服务器的哪里呢?我们可以到php.ini里面查看,默认是存放在c/windows/temp/文件夹里面的,可以通过php.ini来修改,这就奇怪了,上面我们不是说那个随机数是session么,这里又说session放在服务器,这不是冲突了,其实不是的,因为上面的那个随机数是以一个cookie的形式存放在客户端,作为一个取服务器session具体内容的凭证,而保持在服务器里面的session才是具体信息,session的设置相对于cookie简单很多,我们可以直接使用$_SEEION来对其赋值,修改,删除等等操作,就好像一个变量一样,而且也不局限与字符串,我们可以对其赋值为数组甚至对象,唯一不行的是资源型,但是不建议赋值对象,因为赋值以后在其他使用session页面也必须要存在同样的对象才可以,要不就会报注意。对于session的销毁我们不单可以对其赋空,还可以unset(),甚至可以调用内置函数session_destroy()来销毁。那么,cookie有生命周期,session也是有的,默认也是只要浏览器关闭就失效,但是这里的失效是指客户端的session凭证失效,而不是服务器端具体内容的消失,在php.ini里面有一个参数设置,默认是24分钟对服务器的session扫描,假如发现过期的话就会对其进行销毁,但是也不是绝对的(约0.1%的几率),一般是浏览器有session处理的时候更容易触发这个垃圾处理机制,因为很多人都不是直接退出登陆而是直接关闭页面,这样就会导致session越来越多。当然,我们也可以手动设置生命周期,也是在php.ini里面设置多长时间失效的,也就是说有可能我在浏览页面的时候,session过期了,又要重获取了,貌似很多网银等系统有多这些设置??这里必须吐槽一下,怎么这么多设置!而session的作用域和那个保存在客户端里面session的凭证(cookie)设置的作用域。在php.ini里面默认了session无论在哪里设置,整站都是有效的。
      注意:因为从HTTP协议的角度看,cookie是放在头文件信息里面传输的,所以session_start()之前是不允许有任何输出的,包括空格.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值