今天看到关于cookie和session的3个问题,整理如下,希望对小伙伴们有所帮助!
1. cookie和session的区别
2. cookie禁止后,会影响session吗?
3. 禁止cookie后,如何让session继续生效
要明白这3个问题,首先要了解这2个东东的工作原理
具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
而cookie又分为persistent cookies和session cookie。
persistent cookie即我们平时所说的cookie,如:保存在客户端硬盘上的一段文本。
session cookie针对某一次会话而言,会话结束session cookie也就随着消失了。
cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为session cookie。session cookie一般保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。
session机制,是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session值检索出来(检索不到,会新建一个)。如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与它相关联的session id。session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。一般这个cookie的名字都是类似于SEEESIONID。
看了上面的工作原理,大概明白已上的3个问题的答案了吧?
1. cookie 和session 的区别:
a. cookie数据存放在客户的浏览器上,session数据放在服务器上。
b. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
c. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
d. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
e. 所以建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中,或者cookie保存一直标识值,在服务器有与标识值对应的内容
2. cookie禁止后,会影响session吗?
由于大部分的session是使用session cookie,所以cookie禁止后,如使用session cookie的话,就会影响session的使用。
为此有了以下的这个问题
3. 禁止cookie后,如何让session继续生效
1、设置php.ini的session.use_trans_sid = 1或者打开enable-trans-sid选项,让PHP自动跨页传递session id。(我试了这种方法,并未在url看到带上session id的值)
2、手动通过URL传值、隐藏表单传递session id。但出于用户安全考虑,建议不要轻易使用次方法。有兴趣的朋友可以用以下代码试验下。
<?php
/*
* a.php
* COOKIE禁用后,SESSION是否还生效
* 页面a,点击“跳转到页面b”后,查看session是否还生效
*/
session_start();
$_SESSION['name'] = 'bala';
$_SESSION['sex'] = 'boy';
echo $_SESSION['name'] . '-' . $_SESSION['sex'];
?>
<html>
<body>
<a href="./b.php?sid=<?php echo session_id();?>">跳转到b页面</a>
</body>
</html>
<?php
/*
* b.php
*/
session_id($_GET['sid']);
session_start();
echo 'SESSION 为:' . $_SESSION['name'] . '-' . $_SESSION['sex'];
结果如下:
总结:
之前我一直误以为“只要关闭浏览器,session就消失了”。其实是错误的理解。
只有在程序通知服务器删除一个session或session过期,否则服务器会一直保留,浏览器不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用session cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session(但服务器上有可能还保存与这个session id对应的内容)。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。